通过反思联系通用代表

时间:2012-08-23 10:44:19

标签: c# delegates runtime

我想在运行时挂钩一个泛型委托,你可以查看下面的示例代码。

然而,在将委托绑定到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) { }
}

1 个答案:

答案 0 :(得分:1)

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

Delegate.CreateDelegate(delegateType, null, methodInfo);

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

Delegate.CreateDelegate(delegateType, methodInfo);

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

eventInfo.AddEventHandler(obj, del);