Asd*_*dfg 30 c# linq lambda delegates
我有一个具有bool属性的基类,如下所示:
public abstract class MyBaseClass
{
public bool InProgress { get; protected set; }
}
Run Code Online (Sandbox Code Playgroud)
我从它继承了另一个类,并尝试将InProgress添加为字典的委托.但它给我一个错误.这就是我的Derived类的样子:
public abstract class MyClass
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("InProgress", InProgress => base.InProgress = InProgress);
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
无法将lambda表达式转换为类型"object",因为它不是委托类型
我在这做错了什么?
Me.*_*ame 27
最好的方法是对字典进行强类型化,但如果首先将lambda分配给特定的lambda(委托),它应该可以工作(因为编译器会知道委托格式):
Action<bool> inp = InProgress => base.InProgress = InProgress;
dict.Add("InProgress", inp);
Run Code Online (Sandbox Code Playgroud)
或者直接投射,效果相同
dict.Add("InProgress", (Action<bool>)(InProgress => base.InProgress = InProgress));
Run Code Online (Sandbox Code Playgroud)
当然,具有对象的字典格式是可讨论的,因为您必须知道委托格式才能使用它.
小智 5
尽管@Me.Name的解决方案本身完全有效,但在某些情况下还有一个额外的技巧可能会派上用场(对我来说确实如此):如果您使用此技术转换多个 lambda,则可以考虑演员表作为辅助方法,沿着
object myDelegateToObject ( Action<bool> action ) {
return action; // autocast to `object` superclass, no explicit cast needed
}
Run Code Online (Sandbox Code Playgroud)
然后简单地调用它
dict.Add("InProgress", myDelegateToObject(InProgress => base.InProgress = InProgress));
Run Code Online (Sandbox Code Playgroud)
以后可能会节省您的时间 - 如果您决定更改以更改签名,则只需在一个地方执行此操作。
归档时间: |
|
查看次数: |
63881 次 |
最近记录: |