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
相关产品推荐
相关产品推荐

