Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 添加事件处理程序和表达式树_.net_Events_C# 4.0_Expression Trees - Fatal编程技术网

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

.net 添加事件处理程序和表达式树,.net,events,c#-4.0,expression-trees,.net,Events,C# 4.0,Expression Trees,如何让lambda像这样 Action<EventHandler<TEventArgs>> adder = vs => GenericEvent += vs Action adder=vs=>GenericEvent+=vs 使用表达式树。此代码不起作用: Expression<Func<EventHandler<TEventArgs>>> handler = () => GenericEvent; var vs = E

如何让lambda像这样

Action<EventHandler<TEventArgs>> adder = vs => GenericEvent += vs
Action 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();
expressionhandler=()=>GenericEvent;
var vs=Expression.Parameter(typeof(EventHandler),“vs”);
var加法器=表达式.Lambda(
Expression.AddAssign(handler.Body,vs),vs.Compile();
错误消息:

未为类型“System.EventHandler
1[ConsoleApplication.Program+SomeEventArgs]”和“System.EventHandler
1[ConsoleApplication.Program+SomeEventArgs]”定义二进制运算符AddAssign


首先,您需要在头脑中非常清楚事件和委托字段之间的区别


在第一种情况下,我们无法判断
GenericEvent
是什么,但如果它确实引用了一个事件,则将调用
add\u GenericEvent
或相应的底层元数据给出的任何内容。将其与第二种情况进行比较,在第二种情况下,您确实希望调用
委托。合并
,将结果强制转换回
EventHandler
,然后将其分配回
GenericEvent
。在这两种情况下,C#编译器实际上都在使用语法糖——您需要取消点击该糖来创建相关的表达式树。

@l33t:如果问题没有更清楚的说明,就很难编写适当的代码。如果你处在一个类似的职位上,但不能让它发挥作用,用一个简单的句子问一个新问题。