在 C# 中,如何使用泛型的基 class 将泛型接口的所有实例注入到单个构造函数中?

In C# how to inject all instances of generic interface into a single constructor using the generic's base class?

我定义了以下接口:

public interface ICustomService<T> where T : CustomObject
{
   IEnumerable<T> GetById(int Id);
   ...
}

还有它的 2 个实现,其中 MyObject1MyObject2 都继承自 CustomObject

public class CustomService1 : ICustomService<MyObject1>
{
    public IEnumerable<MyObject1> GetById(int Id)
    {
        ...
    }
}
public class CustomService2 : ICustomService<MyObject2>
{
    public IEnumerable<MyObject2> GetById(int Id)
    {
        ...
    }
}

我尝试将这两个注册为 ICustomService<CustomObject> 但出现错误:

There is no implicit reference conversion from 'CustomerService1' to 'ICustomService<CustomObject>'

改为这样注册:

services.AddTransient<ICustomService<MyObject1>, CustomService1>();
services.AddTransient<ICustomService<MyObject2>, CustomService2>();

像上面那样注册时,我的 IEnumerable services 是空的:

public ThirdService(IEnumerable<ICustomService<CustomObject>> services)
{
    
}

如何将 ICustomService 的所有实现注入 ThirdService

我正在尝试这样做,以便可以为 ThirdService 提供一个 ID,然后在所有服务上使用 GetById 获取所有具有该 ID 的 CustomObject

假设没有其他接口方法具有类型 T 的参数、类型 T 的可变属性,或 return 使用 [=12= 的泛型类型的方法] 以 non-covariant 的方式,您可以使用 out:

使 T 协变
public interface ICustomService<out T> where T : CustomObject

这将使您的注册尝试有效:

services.AddTransient<ICustomService<MyObject>, CustomService1>();
services.AddTransient<ICustomService<MyObject>, CustomService2>();

Covariance 确保 CustomService1CustomService2 可以安全地用于代替 ICustomService<MyObject>,尽管它们都将 MyObject 的子类声明为通用参数。