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
方法的委託。
用另一種方法包裝'Test'方法。 – Tommy
您正試圖創建與該方法不匹配的類型的委託。你不能那樣做。 – Blorgbeard
@Tommy你能幫我一個例子嗎? – user3736648