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) { }
}
4

1 回答 1

1

当您为静态方法创建委托时,您需要传递null而不是对象实例,如果您正在为实例方法创建委托,则它必须是对定义处理程序方法的对象实例的引用,而不是定义事件的对象。

Delegate.CreateDelegate(delegateType, null, methodInfo);

在这种情况下,您可以进一步简化,只需使用仅需要委托类型和方法信息的重载。

Delegate.CreateDelegate(delegateType, methodInfo);

另请注意,在您提供的示例代码中,您只是创建了委托,而不是实际将其附加到事件。为了将其绑定到事件,您还需要执行以下操作:

eventInfo.AddEventHandler(obj, del);
于 2012-08-23T10:49:17.033 回答