运行时仅持有服务Type实例 如何调用泛型扩展方法MapService注册服务
实现方案
扩展方法本质是定义在静态类中的静态方法,你可以按照以下步骤通过反射调用:
核心步骤
- 首先获取
MapService扩展方法所属的静态类的Type实例 - 拿到该方法的泛型原始定义
- 用你持有的服务Type构造闭合泛型方法
- 传入
IEndpointRouteBuilder实例执行方法即可
完整代码示例
using System.Reflection; using Microsoft.AspNetCore.Routing; // 你持有的服务Type实例 Type serviceType = typeof(MyService); // 你的IEndpointRouteBuilder实例 IEndpointRouteBuilder endpoints = ...; // 1. 获取扩展方法所属静态类的Type,此处替换为你实际的类全限定名 // 也可以直接用typeof(你的扩展方法静态类名)获取,稳定性更高 Type extensionClass = Type.GetType("你的命名空间.扩展方法所在的静态类名"); if (extensionClass == null) throw new InvalidOperationException("未找到扩展方法所属的静态类"); // 2. 获取MapService泛型方法的原始定义 MethodInfo genericMethodDef = extensionClass.GetMethods(BindingFlags.Public | BindingFlags.Static) .Where(m => m.Name == "MapService" && m.IsGenericMethodDefinition && m.GetParameters().Length == 1 && m.GetParameters()[0].ParameterType == typeof(IEndpointRouteBuilder)) .Single(); // 3. 构造绑定了具体服务类型的闭合泛型方法 MethodInfo constructedMethod = genericMethodDef.MakeGenericMethod(serviceType); // 4. 执行调用,静态方法传入null作为实例,参数数组传入builder实例 constructedMethod.Invoke(null, new object[] { endpoints });
注意事项
- 请将代码中
你的命名空间.扩展方法所在的静态类名替换为你实际定义MapService扩展方法的静态类的全限定名 - 若存在多个
MapService重载,需调整方法筛选逻辑,匹配参数列表完全对应的方法定义 - 运行时依然会校验泛型约束,如果传入的
serviceType不满足class约束,调用时会抛出异常
内容的提问来源于stack exchange,提问作者Sameed
相关产品推荐
相关产品推荐

