【发布时间】:2021-07-17 10:27:37
【问题描述】:
我想查找所有实现 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.
我该怎么做?
【问题讨论】:
-
@KlausGütter 更新
-
你真的确定在任何加载的程序集中至少有一个公共类型实现接口?
-
@KlausGütter 是的。如果我按名称搜索它,我可以找到它。当然,我需要在不使用名称的情况下动态完成。
-
“按名称搜索”是指用
.Where(type => type.Name == "xyz")替换最后一个where?你能给出相关类型的定义吗? -
MyJsonsOptions中的JsonOptions类型和您查询中的JsonOptions是否有可能实际上不是同一类型?您也许可以尝试`x.GetGenericArguments()[0].Name == "JsonOptions"`
标签: c# generics reflection