.NET无法创建开放类型的数组

db2dz4w8  于 2023-07-01  发布在  .NET
关注(0)|答案(1)|浏览(116)

我有一个类型IReadableEntity<T>,它是泛型的,当我们想要实现它时,需要指定一个T类型。
使用依赖注入,我试图得到它的所有实现:

using (var scope = app.Services.CreateScope())
{
    var test = scope.ServiceProvider.GetService(typeof(IEnumerable<>).MakeGenericType(typeof(IReadableEntity<>)));
}

通常,我可以通过使用此模式以列表的形式获得接口的所有实现,但它不适用于开放泛型类型。我得到以下错误:
System.NotSupportedException:'无法创建开放类型的数组。'
我怎样才能得到我的接口IReadableEntity<T>的所有实现,而不管T的类型是什么?

6kkfgxo0

6kkfgxo01#

我会创建一个新的非泛型接口并将其用作签名。

// Empty base interface used as a signature
public interface IReadableEntity {}

public interface IReadableEntity<T> : IReadableEntity
{
  void DoSomething(T value);
}

public class SampleReadableEntity : IReadableEntity<int>
{
  public void DoSomething(int value);
}

var services = new ServiceCollection()
.AddSingleton<SampleReadableEntity >()
.AddSingleton<IReadableEntity<int>>(provider => provider.GetRequiredService<SampleReadableEntity >())
.AddSingleton<IReadableEntity>(provider => provider.GetRequiredService<SampleReadableEntity >())
.BuildServiceProvider();

var allReadableEntities = services.GetServices<IReadableEntity>();
var allIntReadableEntities = service.GetServices<IReadableEntity<int>>();
var sampleReadableEntity = services.GetService<SampleReadableEntity>();

相关问题