2012-08-23 64 views
1

我想在運行時連接一個通用委託,可以查看下面的示例代碼。通過反射連接通用委託

但是綁定代理與事件Delegate.CreateInstance我得到一個ArgumentException('錯誤綁定到目標方法')。

class MyClass 
{ 
    public event EventHandler<MyEventArgs> OnRequest; 
} 

class MyEventArgs : EventArgs { } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyClass obj = new MyClass(); 
     EventInfo eventInfo = obj.GetType().GetEvent("OnRequest"); 
     Type delegateType = eventInfo.EventHandlerType; 
     MethodInfo methodInfo = typeof(Program).GetMethod("OnRequestReceived"); 
     Delegate del = Delegate.CreateDelegate(delegateType, methodInfo); 
    } 

    public static void OnRequestReceived(object o, EventArgs e) { } 
} 

回答

1

當你爲一個靜態方法創建一個委託你需要傳遞null,而不是一個對象實例的,如果你正在創建一個實例方法,它必須是一個定義對象的實例的引用處理程序方法而不是定義事件的對象的實例。

Delegate.CreateDelegate(delegateType, null, methodInfo); 

在這種情況下,您可以進一步簡化,只使用只需要委託類型和方法信息的重載。

Delegate.CreateDelegate(delegateType, methodInfo); 

還要注意,在示例代碼中你提供你剛剛創建的委託,並沒有真正將其連接到該事件。爲了把它綁定到事件你還需要以下內容:

eventInfo.AddEventHandler(obj, del); 
+0

工作得很好!感謝和擁抱 – user1619447