假设你有这样的方法
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>
。这两种类型无法相互转换,因为它们是不相关的委托。
我会说不复制代码或忽略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);
(此处不需要首先将事件处理程序分配给局部变量以获得线程安全的标准模式,因为我们已经隐式地将其复制为方法调用的一部分。)