无法将lambda表达式转换为类型';对象';因为它不是委托类型

本文关键字:类型 因为 对象 转换 lambda 表达式 | 更新日期: 2023-09-27 17:59:28

我有一个基类,它有一个bool属性,看起来像这样:

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

我继承了它的另一个类,并试图将InProgress作为委托添加到字典中。但这给我带来了一个错误。这就是我的派生类的样子:

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

这是我得到的错误:

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

我在这里做错了什么?

无法将lambda表达式转换为类型';对象';因为它不是委托类型

最好是让字典具有强类型,但如果您先将lambda分配给特定的lambda(委托),它应该可以工作(因为编译器随后知道委托格式):

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

直接铸造,效果相同

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

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

我在丢失时出现此错误

using System.Data.Entity;

尽管@Me.Name的解决方案本身是完全有效的,但在某些情况下,还有一个额外的技巧可能会派上用场(对我来说确实如此):如果你使用这种技术转换多个Lambda,你可以将强制转换作为一种辅助方法,就像一样

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

然后简单地称之为

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

这可能会在以后为您节省时间——如果您决定更改签名,您将只能在一个地方这样做。

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

请确保您的对象具有可用的构造函数。您可能无法按所需方式成功实例化该对象。如果使用lambda指向构造函数,请确保可以在正常实例化语句中以相同方式调用该构造函数。

return x => new FakeObject();

比如

var fake = new FakeObject();

如果不起作用,那么lambda也会失败,所以要小心。

如果在nocommerce中遇到此错误,则需要添加导入行using System.Linq;

相关文章: