首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时接受EventHandler<T>和EventHandler的方法

同时接受EventHandler<T>和EventHandler的方法
EN

Stack Overflow用户
提问于 2019-04-19 21:15:31
回答 1查看 49关注 0票数 1

假设您有一个这样的方法

代码语言:javascript
复制
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 )?

当前的解决方案是这个额外的方法:

代码语言:javascript
复制
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>。这两种类型不能相互转换,因为它们是不相关的委托。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-19 22:16:56

我要说的是,不复制代码或忽略EventArgs的最短的正确解决方案是:

代码语言:javascript
复制
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);

(为了线程安全,首先将事件处理程序分配给局部变量的标准模式在这里是不必要的,因为我们已经将其隐式复制为方法调用的一部分。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55762480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档