使用反射查找 IConfigureOptions<JsonOptions> 实现

Use reflection to find IConfigureOptions<JsonOptions> implementations

我想找到实现 ASP.NET Core 的 IConfigureOptions<JsonOptions> 接口的所有类型。

这是一个这样的例子 class:

public sealed class MyJsonOptions : IConfigureOptions<JsonOptions> {
  public void Configure(JsonOptions options) { }
}

这没有找到:

AppDomain.CurrentDomain
.GetAssemblies()
.Where(assembly => !assembly.IsDynamic)
.SelectMany(assembly => assembly.ExportedTypes)
.Where(type => type.IsAssignableTo<IConfigureOptions<JsonOptions>>())
.ToArray();

我也试过这个:

AppDomain.CurrentDomain
.GetAssemblies()
.Where(assembly => !assembly.IsDynamic)
.SelectMany(assembly => assembly.ExportedTypes)
.Where(type => type
  .GetInterfaces()
  .Any(x =>
    x.IsGenericType &&
    x.GetGenericTypeDefinition() == typeof(IConfigureOptions<>)))
    //&& x.GetGenericArguments()[0] == typeof(JsonOptions)  // if included then nothing found
.ToArray();

这给了我实现 IConfigureOptions<> 的所有类型。但当然我还需要类型参数 JsonOptions.

我该怎么做?

MyJsonsOptions 中的 JsonOptions 类型和您查询中的 JsonOptions 类型实际上可能不是同一类型,.NET 中至少有两个:

因此请务必在 .Where(type => type.IsAssignableTo<IConfigureOptions<JsonOptions>>()) 中选择正确的 JsonOptions 类型。

(或者,也可以按名称比较 x.GetGenericArguments()[0].Name == "JsonOptions")。