无法将lambda表达式转换为类型“object”,因为它不是委托类型

我有一个具有bool属性的基类,如下所示:

public abstract class MyBaseClass { public bool InProgress { get; protected set; } } 

我从它inheritance了另一个类,并尝试将InProgress添加为字典的委托。 但它给我一个错误。 这就是我的Derived类的样子:

 public abstract class MyClass { Dictionary dict = new Dictionary(); dict.Add("InProgress", InProgress => base.InProgress = InProgress); } 

这是我得到的错误:

无法将lambda表达式转换为类型“object”,因为它不是委托类型

我在这做错了什么?

最好的方法是强列入字典,但是如果首先将lambda分配给特定的lambda(委托),它应该可以工作(因为编译器知道委托格式):

  Action inp = InProgress => base.InProgress = InProgress; dict.Add("InProgress", inp); 

或者直接投射,效果相同

  dict.Add("InProgress", (Action)(InProgress => base.InProgress = InProgress)); 

当然,具有对象的字典格式是可讨论的,因为您必须知道委托格式才能使用它。

我失踪时得到了这个错误

 using System.Data.Entity; 

尽管@ Me.Name的解决方案本身是完全有效的,但在某些情况下还有一个额外的技巧可以派上用场(它确实对我有用):如果你使用这种技术转换多个lambdas,你可以将转换因子考虑在内作为帮助方法,沿着

 object myDelegateToObject ( Action action ) { return action; // autocast to `object` superclass, no explicit cast needed } 

然后简单地调用它

 dict.Add("InProgress", myDelegateToObject(InProgress => base.InProgress = InProgress)); 

它可以节省您的时间 – 如果您决定更改以更改签名,您将只在一个地方这样做。

我在编写unit testing时遇到了这个问题。 我试图模拟数据库的行为,以从存储库返回一个新对象,而不是实际连接到数据库。

确保您的对象具有可用的构造函数。 您可能无法以您希望的方式成功实例化该对象。 确保您是否使用lambda指向构造函数,以便在正常的实例化语句中以相同的方式调用构造函数。

 return x => new FakeObject(); 

在这种情况下说

 var fake = new FakeObject(); 

不会工作然后lambda也会失败所以要小心。