2010-07-05 46 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