我想在运行时挂钩一个泛型委托,你可以查看下面的示例代码。
然而,在将委托绑定到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) { }
}
答案 0 :(得分:1)
为静态方法创建委托时,需要传递null
而不是对象实例,如果要为实例方法创建,则必须是对定义的对象实例的引用处理程序方法,而不是定义事件的对象的实例。
Delegate.CreateDelegate(delegateType, null, methodInfo);
在这种情况下,您可以进一步简化并只使用仅需要委托类型和方法信息的重载。
Delegate.CreateDelegate(delegateType, methodInfo);
另请注意,在您提供的示例代码中,您只是创建委托而不是实际将其附加到事件中。为了将其绑定到事件,您还需要以下内容:
eventInfo.AddEventHandler(obj, del);