2010-07-05 47 views
1

如何使用表达式目录树,使拉姆达这样添加事件处理程序和表达式树

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(); 

错误消息:

的二进制运算符中用addAssign未对该类型 'System.EventHandler 1[ConsoleApplication.Program+SomeEventArgs]' and 'System.EventHandler 1 [ConsoleApplication.Program + SomeEventArgs]' 限定。

回答

3

好吧,首先你需要清楚事件和委托字段之间的区别。

我们不知道什么是GenericEvent在第一种情况下,但如果真的确实是指一个事件,那将是调用add_GenericEvent或任何适当的底层的元数据给出。与第二种情况相比,您确实想要拨打Delegate.Combine,将结果转回EventHandler<TEventArgs>,然后将其归还为GenericEvent。在这两种情况下,C#编译器确实都在使用语法糖 - 并且您需要取出糖来创建相关的表达式树。

+0

那么最终的代码是什么样的? – l33t 2017-04-06 14:29:58

+0

@ l33t:如果没有更清晰的问题,很难写出适当的代码。如果您处于类似的位置,但无法使其工作,请用[mcve]问一个新问题。 – 2017-04-06 14:31:27