2013-07-07 47 views
0

請參閱下面的示例。我需要將通過反射獲得的DoSomething方法連接到事件。如何用反射連接事件

class Program { 
    private static event EventHandler MyEvent; 

    static void Main(string[] args) 
    { 
     object aType = new SomeType(); 

     var type = aType.GetType(); 

     var method = type.GetMethod("DoSomething"); 

     if (method != null) 
     { 
      MyEvent += method;//How do I wire this up? 
     } 
    } 
} 


public class SomeType { 
    public void DoSomething() { 
     Debug.WriteLine("DoSomething ran."); 
    } 
} 

回答

4

你需要創建一個委託:

MyEvent += (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method); 

的第二個參數是委託綁定到實例。
欲瞭解更多信息,請參閱my blog

與其他委託一樣,只有當目標方法與委託具有相同的簽名(參數類型)時,這纔會起作用。

+0

您還需要createDelegate方法的結果轉換到事件處理程序 –

+0

感謝您的快速響應。這非常有幫助。 –

4

其實,您不能使用DoSomething作爲MyEvent的處理程序,因爲它沒有正確的簽名。假設你改變DoSomething簽名本:

public void DoSomething(object sender, EventArgs e) 

您可以訂閱像這樣的事件:

if (method != null) 
    { 
     var dlg = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method); 
     MyEvent += dlg; 
    }