接受两个EventHandler的方法 和EventHandler

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接受两个EventHandler的方法 和EventHandler相关的知识,希望对你有一定的参考价值。

假设你有这样的方法

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

(此处不需要首先将事件处理程序分配给局部变量以获得线程安全的标准模式,因为我们已经隐式地将其复制为方法调用的一部分。)

以上是关于接受两个EventHandler的方法 和EventHandler的主要内容,如果未能解决你的问题,请参考以下文章

具有通用模板基类型的 STL 容器,接受派生类型

java swing 防抖机制

事件2 (标准 EventHandler)

4.1.6EventHandler自定义事件参数类

JQuery的on()监听方法使用

Prolog中两个执行偶数和奇数的区别