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

C#如何通过反射构造带指定泛型参数的接口Type实例用于DI服务获取

实现方案

你需要先获取泛型接口的开放类型,再通过MakeGenericType方法构造指定参数的闭合泛型类型,修改后的代码如下:

public async Task<TResponse> Handle(
    TRequest request,
    CancellationToken cancellationToken,
    RequestHandlerDelegate<TResponse> next)
{
    using var scope = serviceProvider.CreateScope();
    var requestType = request.GetType();
    var responseType = typeof(TResponse);
    
    // 核心逻辑:构造闭合泛型类型
    var closedHandlerType = typeof(ICacheRequestHandler<,>).MakeGenericType(requestType, responseType);
    var handler = scope.ServiceProvider.GetService(closedHandlerType);

    if (handler != null)
    {
        // 动态调用HandleAsync方法
        return await ((dynamic)handler).HandleAsync((dynamic)request, cancellationToken);
    }

    // 无对应缓存处理器则走原有请求流程
    return await next();
}

原理解释

  • C#中泛型类型分为两类:未填充泛型参数的开放泛型类型、填充了所有泛型参数的闭合泛型类型。只有闭合泛型类型可以直接用来实例化对象、从DI容器解析服务。
  • typeof(ICacheRequestHandler<,>) 获取的就是该接口的开放泛型类型,尖括号内的逗号数量对应泛型参数的数量,双泛型参数只需要写1个逗号。
  • MakeGenericType 方法会按传入的Type顺序替换开放泛型的参数,生成你需要的闭合泛型类型。
  • 拿到handler实例后用dynamic类型调用方法,不需要手动写反射调用逻辑,代码更简洁,只要实现类符合接口定义就不会出现运行时错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:54:04