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

时间:2014-04-23 14:16:59

标签: c# linq lambda delegates

我有一个具有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'类型,因为它不是委托类型

我在这里做错了什么?

5 个答案:

答案 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;