同时接受EventHandler <t>和EventHandler的方法

时间:2019-04-19 13:15:31

标签: c# generics

假设您有这样的方法

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 EventHandlereventArgs,例如在后一种情况下可以是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>。这两种类型是互不相关的委托,因此无法相互转换。

1 个答案:

答案 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);

(出于线程安全的考虑,首先不需要将事件处理程序分配给局部变量的标准模式,因为我们已经在方法调用中隐式复制了该事件。)