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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:45:02