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

时间:2021-07-17 10:27:37

标签: c# generics reflection

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

以下是此类的示例:

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<> 的所有类型。但当然我也需要 typeparam JsonOptions.

我该怎么做?

1 个答案:

答案 0 :(得分:1)

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

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

(或者,只需按名称 x.GetGenericArguments()[0].Name == "JsonOptions" 进行比较)。

相关问题