如何为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");
}
以下是例外:
未处理的类型&#39; System.ArgumentException&#39;发生在 mscorlib.dll中
其他信息:无法绑定到目标方法,因为它 签名或安全透明度与 代表类型。
例外情况发生在以下行:
Delegate d = Delegate.CreateDelegate(tDelegate, this, methodInfoName);
我理解为什么会发生异常,问题不是关于异常,而是如何为Test
方法创建委托。
答案 0 :(得分:1)
创建一个直接调用Test
方法的包装方法。
public void WrapTest(object sender, EventArgs e)
{
Test();
}
public void Test()
{
...
}
改为使用包装方法。
class1.AddHandlerToEventInfo(eventInfo, "WrapTest");