假设您有一个这样的方法
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>。这两种类型不能相互转换,因为它们是不相关的委托。
发布于 2019-04-19 22:16:56
我要说的是,不复制代码或忽略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);(为了线程安全,首先将事件处理程序分配给局部变量的标准模式在这里是不必要的,因为我们已经将其隐式复制为方法调用的一部分。)
https://stackoverflow.com/questions/55762480
复制相似问题