使用反射为任何事件创建代理委托

时间:2015-08-05 20:23:28

标签: c# .net reflection delegates .net-4.5

我正在尝试编写一个允许使用属性附加事件的库,我想创建一组便捷方法签名。

例如,按钮的Click事件的处理程序签名为void(object, EventArgs)

我已经直接映射了与此签名匹配的方法:

// the object that raises the event
Object eventSource = ...;
EventInfo evnt = ...; 

// the object with the target method
Object target = ...;
MethodInfo method = ...;

// create and attach delegate
var del Delegate.CreateDelegate(evnt.EventHandlerType, target, method);
evnt.AddEventHandler(eventSource, del);

只要方法相同/兼容,即使分离事件,这也很有效:

evnt.RemoveEventHandler(eventSource, del);

但是,我也希望能够映射无参数方法。 是否可以创建一个接受任何参数的委托,然后忽略它们,并在对象上调用所需的方法?

例如,在工作位中,我可以这样做:

// the method
void MyClickMethod(object sender, EventArgs e)
{
}

// the execution
var evnt = myButton.GetType().GetEvent("Click");
var method = this.GetType().GetMethod("MyClickMethod")
AttachEvent(/*eventSource*/ myButton, /*evnt*/ evnt, /*target*/ this, /*method*/ method);

但是,我也希望能够附上这种方法:

void MyClickMethod()
{
}

我的逻辑是,我们可以将任何类型的无参数方法附加到任何事件。这通常非常有用。重要的是我能够分离任何事件。

在我看来,会以某种方式创建一个执行此操作的委托:

eventSource.Event += (sender, e) => {
    target.method();
};

有没有办法干净利落地做到这一点?

0 个答案:

没有答案