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

如何通过反射动态构造泛型委托实现第三方库批量回调注册

问题原因

  1. 创建委托时传入的是未绑定具体类型的开放泛型typeof(Library.Handler<>),和已经构造完成的封闭泛型方法methodApplicationGeneric不匹配
  2. OnHandler<T>是实例方法,Delegate.CreateDelegate需要传入方法所属的实例对象,否则参数签名无法匹配

修正代码

把Run方法里的委托创建逻辑替换为以下内容即可正常运行:

public void Run()
{
    var library = new Library();
    var types = new List<Type>() {typeof(int), typeof(string)};
    foreach(var type in types)
    {
        var methodLibrary = library.GetType().GetMethod("Subscribe");
        var methodLibraryGeneric = methodLibrary.MakeGenericMethod(type);
        var methodApplication = this.GetType().GetMethod("OnHandler", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var methodApplicationGeneric = methodApplication.MakeGenericMethod(type);

        // 构造当前类型对应的封闭泛型委托类型
        Type closedHandlerType = typeof(Library.Handler<>).MakeGenericType(type);
        // 传入实例this作为委托的目标对象
        var delegateApplication = Delegate.CreateDelegate(closedHandlerType, this, methodApplicationGeneric);

        methodLibraryGeneric.Invoke(library, new object[] {delegateApplication});
    }
}

补充说明

如果后续遇到带in/out/ref参数的委托创建场景,只要方法签名和委托签名完全匹配,按照上面的逻辑构造对应封闭泛型委托类型、传入对应实例即可正常创建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:30:03