如何注册带任意参数的委托方法,通过统一调用方法后续触发执行?
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
相关产品推荐
相关产品推荐

