2010-11-05 134 views
7

我有一個非常簡單的類:訂閱事件與反思

class Trace 
{ 
    void WriteTrace() 
    { 
     Console.WriteLine("Trace !"); 
    } 
} 

我想這個類訂閱事件,例如表單控件的加載事件。控制和事件是動態定義,所以我想使用反射來做到這一點,我想這樣的事情:

在我的課堂跟蹤我有這樣的方法:

public void SubscribeEvent (Control control) 
{ 
     if (type.IsAssignableFrom(control.GetType())) 
     { 
      Trace test = this; 
      MethodInfo method = typeof(Trace).GetMethod("WriteTrace"); 

      // Subscribe to the event 
      EventInfo eventInfo = control.GetType().GetEvent("Load"); // We suppose control is a form 
      Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, control, method); // ERROR : Error binding to target method 

     } 
    } 
} 

有一個錯誤的最後一行:錯誤綁定到目標方法。我的代碼段出了什麼問題?

謝謝!

編輯:好吧,沒有更多的錯誤,但當從窗體中引發事件「Load」時,方法WriteTrace不會被調用(我已經放置了一個斷點但沒有到達)。爲什麼?

對不起,編輯,它的工作原理很細:)

+0

爲什麼你想要使用反射,如果你只能訂閱/添加處理程序的事件? 'control.Load + = HandlerHere;'...另一方面,你是否曾經用'Form'代替Control?因爲你首先在談論一個表單。 – Bobby 2010-11-05 09:53:22

+0

這只是一個例子,但我應該能夠選擇控制和事件追蹤。 – Florian 2010-11-05 10:27:14

回答

8

通過一些更改,我能夠執行您的示例。

首先,在Trace方法必須有不同的特徵與所述EventHandler類型一致:

public class Trace 
{ 
    public void WriteTrace(object sender, EventArgs e) 
    { 
     Console.WriteLine("Trace !"); 
    } 
} 

下,一些變化在SubscribeEvent提出:

public void SubscribeEvent(Control control) 
{ 
    if (typeof(Control).IsAssignableFrom(control.GetType())) 
    { 
     Trace test = this; 
     MethodInfo method = typeof(Trace).GetMethod("WriteTrace"); 

     EventInfo eventInfo = control.GetType().GetEvent("Load"); 

     // Create the delegate on the test class because that's where the 
     // method is. This corresponds with `new EventHandler(test.WriteTrace)`. 
     Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, test, method); 
     // Assign the eventhandler. This corresponds with `control.Load += ...`. 
     eventInfo.AddEventHandler(control, handler); 
    } 
} 

我希望這幫助。

1

你的第一個問題是Trace.WriteTrace方法簽名不匹配Form.Load事件處理程序的語法

試試這個:

void WriteTrace(object sender, EventArgs e) 
{ 
    Console.WriteLine("Trace !"); 
} 

而且,你的電話createDelegate方法需要通過跟蹤對象,而不是控制對象:

Trace test = this; 
MethodInfo method = typeof(Trace).GetMethod("WriteTrace"); 

// Subscribe to the event 
EventInfo eventInfo = control.GetType().GetEvent("Load"); // We suppose control is a form 

Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, method); // ERROR : Error binding to target method 
eventInfo.AddEventHandler(control, handler);