【问题标题】:Use reflection to find IConfigureOptions<JsonOptions> implementations使用反射查找 IConfigureOptions<JsonOptions> 实现
【发布时间】:2021-07-17 10:27:37
【问题描述】:

我想查找所有实现 ASP.NET Core 的IConfigureOptions&lt;JsonOptions&gt; 接口的类型。

以下是此类的一个示例:

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&lt;&gt; 的所有类型。但当然我还需要 typeparam JsonOptions.

我该怎么做?

【问题讨论】:

  • @KlausGütter 更新
  • 你真的确定在任何加载的程序集中至少有一个公共类型实现接口?
  • @KlausGütter 是的。如果我按名称搜索它,我可以找到它。当然,我需要在不使用名称的情况下动态完成。
  • “按名称搜索”是指用.Where(type =&gt; type.Name == "xyz")替换最后一个where?你能给出相关类型的定义吗?
  • MyJsonsOptions 中的JsonOptions 类型和您查询中的JsonOptions 是否有可能实际上不是同一类型?您也许可以尝试`x.GetGenericArguments()[0].Name == "JsonOptions"`

标签: c# generics reflection


【解决方案1】:

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

所以请务必在 .Where(type =&gt; type.IsAssignableTo&lt;IConfigureOptions&lt;JsonOptions&gt;&gt;()) 中选择正确的 JsonOptions 类型。

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

【讨论】:

  • 你是对的,框架中有are twoJsonOptions类型。谢谢!
猜你喜欢
  • 2010-12-03
  • 2023-03-03
  • 2011-09-18
  • 1970-01-01
  • 2015-10-21
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多