我正在尝试编写一个允许使用属性附加事件的库,我想创建一组便捷方法签名。
例如,按钮的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();
};
有没有办法干净利落地做到这一点?