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

如何在AddScoped中通过接口为泛型类型分配动态类型?

动态注册泛型Scoped服务(基于Type对象)

要实现通过动态获取的Type对象注册MyClass<T>(实现IMyInterface<T>,T为引用类型)的Scoped服务,核心是利用.NET依赖注入中AddScoped的Type参数重载,结合泛型类型的动态构造来完成。

实现步骤

  1. 获取开放泛型类型:先拿到不带具体泛型参数的接口和实现类的开放泛型类型(即带<>的版本)。
  2. 构造闭合泛型类型:针对每个动态获取的Type对象(即具体的T),通过MakeGenericType方法生成对应的闭合泛型接口和实现类类型。
  3. 调用Type重载注册:使用AddScoped(Type serviceType, Type implementationType)完成注册。

代码示例

基础注册逻辑

// 1. 获取开放泛型的接口与实现类类型
var openInterface = typeof(IMyInterface<>);
var openImplementation = typeof(MyClass<>);

// 2. 示例:动态获取需要注册的T类型列表(可替换为你的Type来源)
var targetTypes = new List<Type>
{
    typeof(User),
    typeof(Product),
    typeof(Order)
};

// 3. 遍历注册每个泛型实例
foreach (var t in targetTypes)
{
    // 过滤非引用类型(符合需求中T为引用类型的要求)
    if (!t.IsClass || t.IsValueType)
        continue;

    // 构造针对当前T的闭合泛型类型
    var closedInterface = openInterface.MakeGenericType(t);
    var closedImplementation = openImplementation.MakeGenericType(t);

    // 注册Scoped服务
    services.AddScoped(closedInterface, closedImplementation);
}

从实例获取Type的场景

如果你的Type来自某个实例的GetType(),可以直接用该Type构造并注册:

var sampleInstance = new User();
var t = sampleInstance.GetType();

var closedInterface = typeof(IMyInterface<>).MakeGenericType(t);
var closedImplementation = typeof(MyClass<>).MakeGenericType(t);

services.AddScoped(closedInterface, closedImplementation);

关键说明

  • 开放泛型类型(如typeof(IMyInterface<>))是泛型类型的模板,通过MakeGenericType可以生成针对具体T的实际类型。
  • AddScoped(Type, Type)重载允许我们绕过编译期的泛型参数约束,直接基于运行时Type完成注册,完美适配动态获取Type的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:45:43