You need to enable JavaScript to run this app. 如何注册带任意参数的委托方法,通过统一调用方法后续触发执行?
优惠活动
大模型
产品
解决方案
定价
更多

如何注册带任意参数的委托方法,通过统一调用方法后续触发执行?

C# 延迟回调调用实现方案

核心逻辑是在类中存储注册的回调委托和对应的参数,需要额外加一层委托适配兼容不同参数签名的普通方法,无需调用方手动转换。

完整实现代码如下:

public class DeferredInvoker
{
    // 自定义支持可变参数的委托
    public delegate void MyDelegate(params object[] args);
    
    // 存储已注册的回调和预传入的参数
    private MyDelegate _savedCallback;
    private object[] _savedArgs;

    // 标准注册方法
    public void Register(MyDelegate callback, params object[] args)
    {
        _savedCallback = callback;
        _savedArgs = args;
    }

    // 重载注册方法:自动适配任意签名的方法为MyDelegate,兼容示例调用写法
    public void Register(Delegate commonCallback, params object[] args)
    {
        Register(invokeParams => commonCallback.DynamicInvoke(invokeParams), args);
    }

    // 按需触发回调
    public void InvokeOnNeed()
    {
        // 空判断避免未注册时调用抛空引用异常
        _savedCallback?.Invoke(_savedArgs);
    }
}

调用示例完全匹配给出的写法:

public class UsageDemo
{
    private readonly DeferredInvoker _invoker = new DeferredInvoker();

    private void foo(string foostring)
    {
        Console.WriteLine($"执行foo方法,传入参数:{foostring}");
    }

    private void bar(int barint)
    {
        Console.WriteLine($"执行bar方法,传入参数:{barint}");
    }

    public void Test()
    {
        // 注册foo回调和参数
        _invoker.Register(foo, "foo");
        // 触发调用
        _invoker.InvokeOnNeed(); // 输出:执行foo方法,传入参数:foo

        // 注册bar回调覆盖之前的注册内容
        _invoker.Register(bar, 123);
        // 触发调用
        _invoker.InvokeOnNeed(); // 输出:执行bar方法,传入参数:123
    }
}

扩展说明

  • 如果需要支持同时存储多个回调批量调用,把存储回调和参数的字段修改为List<(MyDelegate Callback, object[] Args)>集合类型,触发时遍历集合逐个调用即可。
  • DynamicInvoke属于动态调用,性能略低于强类型委托调用,如果对性能要求极高,建议提前做参数类型校验,或者定义强类型委托避免动态调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 18:27:07