无法将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(委托),它应该可以工作(因为编译器随后知道委托格式):
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;