2016-06-30 50 views
1

如何動態創建Event的代理的最佳方式,其中目標MethodInfo具有與Event不同的參數?如何爲目標方法具有不同參數的事件創建委託?

這裏是我的類代碼:

public class Class1 
{ 
    public event EventHandler<EventArgs> refresh; 

    public void AddHandlerToEventInfo(EventInfo eventInfo, string methodInfoName) 
    { 
     Type tDelegate = eventInfo.EventHandlerType; 

     var sourceType = this.GetType(); 

     Delegate d = Delegate.CreateDelegate(tDelegate, this, methodInfoName); 

     MethodInfo addHandler = eventInfo.GetAddMethod(); 
     Object[] addHandlerArgs = { d }; 

     addHandler.Invoke(this, addHandlerArgs); 
    } 

    public void HandleEvent(object sender, EventArgs e) 
    { 

    } 

    public void Test() 
    { 

    } 
} 

下面是代碼調用Class1

private void AddHandlers() 
{ 
    var class1 = new Class1(); 
    var eventInfo = class1.GetType().GetEvent("refresh"); 
    class1.AddHandlerToEventInfo(eventInfo, "HandleEvent"); 

    class1.AddHandlerToEventInfo(eventInfo, "Test"); 
} 

這裏是個例外:

類型的未處理的異常「系統.ArgumentException'發生在 mscorlib.dll

附加信息:無法綁定到目標方法,因爲其 簽名或安全透明度與 委託類型的不兼容。

唯一的例外發生在該行:

Delegate d = Delegate.CreateDelegate(tDelegate, this, methodInfoName); 

我明白爲什麼例外發生,這個問題是不是例外,而是如何以創建Test方法的委託。

+2

用另一種方法包裝'Test'方法。 – Tommy

+0

您正試圖創建與該方法不匹配的類型的委託。你不能那樣做。 – Blorgbeard

+0

@Tommy你能幫我一個例子嗎? – user3736648

回答

1

創建一個直接調用您的Test方法的包裝方法。

public void WrapTest(object sender, EventArgs e) 
{ 
    Test(); 
} 
public void Test() 
{ 
    ... 
} 

改爲添加包裝方法。

class1.AddHandlerToEventInfo(eventInfo, "WrapTest"); 
相關問題