添加事件处理程序和表达式树

时间:2010-07-05 18:26:15

标签: .net events c#-4.0 expression-trees

如何像这样制作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。

1 个答案:

答案 0 :(得分:3)

首先,您需要清楚地了解事件和委托字段之间的区别。

我们无法分辨第一种情况下GenericEvent是什么,但是如果真的确实引用了一个事件,则会调用add_GenericEvent或任何适当的事件底层元数据给出。与第二种情况相比,您真正要调用Delegate.Combine,将结果转回EventHandler<TEventArgs>,然后将其分配回GenericEvent。在这两种情况下,C#编译器都在使用语法糖 - 你需要取消该糖来创建相关的表达式树。