如何像这样制作lambda
Action<EventHandler<TEventArgs>> adder = vs => GenericEvent += vs
使用表达式树。此代码不起作用:
Expression<Func<EventHandler<TEventArgs>>> handler = () => GenericEvent;
var vs = Expression.Parameter(typeof(EventHandler<TEventArgs>), "vs");
var adder = Expression.Lambda<Action<EventHandler<TEventArgs>>>(
Expression.AddAssign(handler.Body, vs), vs).Compile();
错误讯息:
没有为类型'System.EventHandler
1[ConsoleApplication.Program+SomeEventArgs]' and 'System.EventHandler
1 [ConsoleApplication.Program + SomeEventArgs]'定义二元运算符AddAssign。
答案 0 :(得分:3)
首先,您需要清楚地了解事件和委托字段之间的区别。
我们无法分辨第一种情况下GenericEvent
是什么,但是如果真的确实引用了一个事件,则会调用add_GenericEvent
或任何适当的事件底层元数据给出。与第二种情况相比,您真正要调用Delegate.Combine
,将结果转回EventHandler<TEventArgs>
,然后将其分配回GenericEvent
。在这两种情况下,C#编译器都在使用语法糖 - 你需要取消该糖来创建相关的表达式树。