Dot-Net
使用反射訂閱事件
我有一個非常簡單的課程:
class Trace { void WriteTrace() { Console.WriteLine("Trace !"); } }我希望這個類訂閱一個事件,例如表單控制項的載入事件。控制項和事件是動態定義的,所以我想使用反射來做到這一點我正在嘗試這樣的事情:
在我的類 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 方法(我已經放置了一個斷點,但沒有到達)。為什麼 ?
抱歉編輯,它工作得很好:)
通過一些更改,我能夠執行您的範例。
首先,方法 on
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); } }我希望這有幫助。