Dot-Net

使用反射訂閱事件

  • November 5, 2010

我有一個非常簡單的課程:

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 方法(我已經放置了一個斷點,但沒有到達)。為什麼 ?

抱歉編輯,它工作得很好:)

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

首先,方法 onTrace必須有不同的簽名來對應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);
   }
}

我希望這有幫助。

引用自:https://stackoverflow.com/questions/4104789