无法将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也会失败所以要小心。