我有一个具有bool属性的基类,如下所示:
public abstract class MyBaseClass
{
public bool InProgress { get; protected set; }
}
我从它继承了另一个类,并尝试将InProgress添加为字典的委托。但它给我一个错误。这就是我的Derived类的样子:
public abstract class MyClass
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("InProgress", InProgress => base.InProgress = InProgress);
}
这是我得到的错误:
无法将lambda表达式转换为'object'类型,因为它不是委托类型
我在这里做错了什么?
答案 0 :(得分:24)
最好是强列入字典,但是如果首先将lambda分配给特定的lambda(委托),它应该可以工作(因为编译器知道委托格式):
Action<bool> inp = InProgress => base.InProgress = InProgress;
dict.Add("InProgress", inp);
或直接投射,效果相同
dict.Add("InProgress", (Action<bool>)(InProgress => base.InProgress = InProgress));
当然,将这种字典格式作为对象是可以讨论的,因为您必须知道委托格式才能使用它。
答案 1 :(得分:11)
我错过了这个错误
using System.Data.Entity;
答案 2 :(得分:2)
虽然 @ Me.Name 的解决方案本身是完全有效的,但在某些情况下可能会派上用场的其他技巧(这对我来说确实有用):如果你和#39;使用这种技术重新转换多个lambdas,你可以将强制转换因子分解为辅助方法
object myDelegateToObject ( Action<bool> action ) {
return action; // autocast to `object` superclass, no explicit cast needed
}
然后只需
调用它dict.Add("InProgress", myDelegateToObject(InProgress => base.InProgress = InProgress));
以后可能会节省您的时间 - 如果您决定更改以更改签名,则必须在一个地方进行更改。
答案 3 :(得分:0)
我在编写单元测试时遇到了这个问题。我试图模拟数据库的行为,从存储库返回一个新对象,而不是实际连接到数据库。
确保您的对象具有可用的构造函数。您可能无法以您希望的方式成功实例化该对象。确保您是否使用lambda指向构造函数,以便在正常的实例化语句中以相同的方式调用构造函数。
即
return x => new FakeObject();
在
的情况下说var fake = new FakeObject();
不起作用,然后lambda也会失败,所以要小心。
答案 4 :(得分:0)
如果您在nopcommerce中遇到此错误,则需要添加导入行using System.Linq;