You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何改写FireEvent方法使其同时支持EventHandler<T>与EventHandler?

优化FireEvent方法的重复代码问题

完全懂你的困扰——两个重载几乎一模一样,就委托类型和参数细节有差异,重复代码不仅冗余,后续维护也容易出问题。咱们可以通过提取公共逻辑到辅助方法的方式解决,把差异部分用委托传递进去,就能大幅减少冗余代码啦。

核心思路

把两个方法里相同的逻辑(打印日志、执行事件触发动作)抽成一个私有辅助方法,让两个重载分别调用这个辅助方法,各自只处理委托空检查和触发动作的差异部分。

具体实现

首先定义处理公共逻辑的辅助方法:

private void FireEventCore(string name, Action fireAction)
{
    Console.WriteLine($"Sending event {name}");
    fireAction();
}

然后改造原来的泛型方法:

private void FireEvent<T>(EventHandler<T> eventHandler, T eventArgs, string name) where T : EventArgs
{
    var handler = eventHandler;
    if (handler != null)
    {
        FireEventCore(name, () => handler(this, eventArgs));
    }
    else
    {
        throw new UnconnectedEventException(name);
    }
}

最后改造EventHandler的重载方法:

private void FireEvent(EventHandler eventHandler, string name)
{
    var handler = eventHandler;
    if (handler != null)
    {
        FireEventCore(name, () => handler(this, EventArgs.Empty));
    }
    else
    {
        throw new UnconnectedEventException(name);
    }
}

为什么这样更优?

  • 消除重复代码:所有公共逻辑集中在FireEventCore里,以后要修改日志格式或添加公共操作,只需要改这一处。
  • 保留线程安全性:依然保留了把eventHandler赋值给局部变量handler的操作,避免多线程环境下委托被意外置空的风险。
  • 逻辑职责清晰:每个重载只负责对应委托类型的空检查和触发动作,代码可读性更强。

内容的提问来源于stack exchange,提问作者Tim Meyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:16:30