C#如何向内置Action的Command对象的回调链中添加方法调用
解决方案
这里提供两种改动成本不同的实现方案,可根据你的实际需求选择:
方案1:最小改动,直接包装回调(无需修改原有类结构)
你可以直接在需要插入后置逻辑的中间Handler中,临时替换Command对象的onCommandComplete回调,把你要加的逻辑嵌套进去即可,原有链路的其他代码完全不用改:
public class CommandHandlerA { CommandHandler commandHandlerC; public void Handle (Command command) { // 原有Handler的前置执行逻辑 // ... // 保存当前Command的原有回调 var originalCallback = command.onCommandComplete; // 替换为包装后的回调:先执行你的后置逻辑,再触发原有回调 command.onCommandComplete = () => { DoThisStuffUponReturningControl(); originalCallback?.Invoke(); }; // 照常把命令传递给下一级Handler commandHandlerC.Handle(command); } void DoThisStuffUponReturningControl() { // 要在链路全部处理完成后执行的逻辑 } }
这种方案和你之前纯Action嵌套的效果完全一致,如果有多个Handler都用这种方式加逻辑,最终后置逻辑的执行顺序会和命令传递顺序相反(后传递的Handler的后置逻辑先执行),完全符合责任链后置处理的需求。
方案2:扩展Command结构,支持多后置处理器(适合有大量后置插入需求的场景)
如果后续会有多个Handler都需要插入后置逻辑,为了避免回调嵌套混乱,可以给Command类扩展后置处理器队列的支持,安全性和可维护性更高:
首先修改Command类:
public class Command { public string commandID; public string[] parameters; // 把原始回调改为私有,禁止外部直接修改 private Action _originalComplete; // 维护后置处理器队列 private List<Action> _postProcessors = new List<Action>(); public Command( string input, Action callback ) { // 原有输入解析逻辑 // ... _originalComplete = callback; } // 提供添加后置逻辑的公开方法 public void AddPostProcessor(Action postAction) { if (postAction != null) { _postProcessors.Add(postAction); } } // 提供统一的完成触发方法,原有链路末尾调用这个方法即可 public void TriggerComplete() { // 按添加顺序执行所有后置逻辑 foreach (var processor in _postProcessors) { processor.Invoke(); } // 最后执行原始回调 _originalComplete?.Invoke(); } }
原有链路末尾触发回调的地方修改为调用TriggerComplete:
public class CommandHandlerC { public void Handle (Command command) { // 原有处理逻辑 // ... command.TriggerComplete(); } }
之后中间Handler需要加后置逻辑时,直接调用AddPostProcessor即可,不需要修改回调,也不会和其他Handler的逻辑冲突:
public class CommandHandlerA { CommandHandler commandHandlerC; public void Handle (Command command) { // 原有前置逻辑 // ... // 添加后置逻辑 command.AddPostProcessor(DoThisStuffUponReturningControl); // 传递命令 commandHandlerC.Handle(command); } void DoThisStuffUponReturningControl() { // 后置逻辑 } }
内容的提问来源于stack exchange,提问作者user765151
相关产品推荐
相关产品推荐

