c# - funciones - No se puede convertir la expresión lambda al tipo ''objeto'' porque no es un tipo de delegado
no se puede convertir expresion lambda en el tipo delegado (4)
Tengo una clase base que tiene una propiedad bool que se parece a esto:
public abstract class MyBaseClass
{
public bool InProgress { get; protected set; }
}
Lo estoy heredando otra clase de él e intento agregar InProgress como delegado al diccionario. Pero me arroja un error. Así es como se ve mi clase Derivada:
public abstract class MyClass
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("InProgress", InProgress => base.InProgress = InProgress);
}
Este es el error que estoy recibiendo:
No se puede convertir la expresión lambda al tipo ''objeto'' porque no es un tipo de delegado
¿Qué estoy haciendo mal aquí?
Aunque la solución de @ Me.Name es completamente válida por sí misma, hay un truco adicional que puede ser útil en algunas situaciones (ciertamente lo fue para mí): si está convirtiendo múltiples lambdas usando esta técnica, puede factorizar el reparto. como un método de ayuda, a lo largo de las líneas de
object myDelegateToObject ( Action<bool> action ) {
return action; // autocast to `object` superclass, no explicit cast needed
}
y luego llamarlo por simplemente
dict.Add("InProgress", myDelegateToObject(InProgress => base.InProgress = InProgress));
Es posible que le ahorre tiempo más adelante: si decide cambiar para cambiar las firmas, tendrá que hacerlo solo en un lugar.
Lo mejor sería tener el diccionario fuertemente tipado, pero si asigna la lambda a un lambda (delegado) específico primero, debería funcionar (porque el compilador conoce el formato del delegado):
Action<bool> inp = InProgress => base.InProgress = InProgress;
dict.Add("InProgress", inp);
O echándolo directamente, mismo efecto.
dict.Add("InProgress", (Action<bool>)(InProgress => base.InProgress = InProgress));
Por supuesto, tener un formato de diccionario como objeto es discutible, ya que tendrá que conocer el formato de delegado para poder usarlo.
Me encontré con este problema mientras escribía pruebas unitarias. Estaba intentando burlar el comportamiento de una base de datos para devolver un nuevo objeto desde un repositorio en lugar de conectarse realmente a una base de datos.
Asegúrese de que su objeto tiene un constructor utilizable. Es posible que no pueda crear una instancia exitosa de ese objeto de la manera que desee. Asegúrese de que si utiliza un lambda para señalar a un constructor, se puede llamar al constructor de la misma manera en una instrucción de instanciación normal.
es decir
return x => new FakeObject();
decir en el caso de
var fake = new FakeObject();
no funcionaría, entonces la lambda también fallará, así que ten cuidado.
Recibí este error cuando faltaba
using System.Data.Entity;