You need to enable JavaScript to run this app. 运行时仅持有服务Type实例 如何调用泛型扩展方法MapService注册服务
优惠活动
大模型
产品
解决方案
定价
更多

运行时仅持有服务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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:36:06