如何通过反射动态构造泛型委托实现第三方库批量回调注册
问题原因
- 创建委托时传入的是未绑定具体类型的开放泛型
typeof(Library.Handler<>),和已经构造完成的封闭泛型方法methodApplicationGeneric不匹配 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
相关产品推荐
相关产品推荐

