我遇到了需要Delegate
内部处理但我想要通用约束的情况。具体来说,我想使用反射添加事件处理程序,但是我想对委托使用通用参数。下面的代码不起作用,因为“ Handler”是类型变量,并且编译器不会强制转换Handler
为Delegate
:
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, (Delegate) d);
}
但是,您可以传递一个为您执行转换的函数。convert
接受Handler
参数并返回Delegate
:
public void AddHandler<Handler>(Control c, string eventName,
Func<Delegate, Handler> convert, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, convert(d));
}
现在,编译器很高兴。调用该方法很容易。例如,将KeyPress
事件附加到Windows窗体控件上:
AddHandler<KeyEventHandler>(someControl,
"KeyPress",
(h) => (KeyEventHandler) h,
SomeControl_KeyPress);
SomeControl_KeyPress
事件目标在哪里。关键是转换器lambda-它不起作用,但是可以说服编译器为您提供了有效的委托。
(开始280Z28)@Justin:为什么不使用它?
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, d as Delegate);
}
(完280Z28)