假设您有这样的方法
private void FireEvent<T>(EventHandler<T> eventHandler, T eventArgs, string name)
{
var handler = eventHandler;
if (handler != null)
{
Console.WriteLine(String.Format("Sending event {0}", name));
handler(this, eventArgs);
}
else
{
throw new UnconnectedEventException(name);
}
}
是否可以重写/重载/扩展此方法,使其同时接受EventHandler<T> and EventHandler
(eventArgs
,例如在后一种情况下可以是EventArgs.empty
)?
当前的解决方案是该附加方法:
private void FireEvent(EventHandler eventHandler, string name)
{
var handler = eventHandler;
if (handler != null)
{
Console.WriteLine(String.Format("Sending event {0}", name));
handler(this, EventArgs.Empty);
}
else
{
throw new UnconnectedEventException(name);
}
}
但是,这涉及到复制实现的每一行,只有一个细微的差别,这使我无法自拔。当然,必须有一个更好的解决方案。
注意:第二个示例将触发EventHandler
,而不是EventHandler<EventArgs>
。这两种类型是互不相关的委托,因此无法相互转换。
答案 0 :(得分:3)
我会说不会复制代码或忽略EventArgs
的最短正确解决方案是:
private void FireEvent<T>(EventHandler<T> eventHandler, T eventArgs, string name)
{
if (eventHandler == null) throw new UnconnectedEventException(name);
Console.WriteLine(String.Format("Sending event {0}", name));
eventHandler(this, eventArgs);
}
private void FireEvent(EventHandler eventHandler, EventArgs eventArgs, string name) =>
FireEvent(eventHandler == null ? null : new EventHandler<EventArgs>(eventHandler), eventArgs, name);
(出于线程安全的考虑,首先不需要将事件处理程序分配给局部变量的标准模式,因为我们已经在方法调用中隐式复制了该事件。)