如何改写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
相关产品推荐
相关产品推荐

