我的第一个目标是基于特定接口过滤具有泛型的类型。
我的第二个目标是获取泛型参数本身的类型。
public UserService : IUserService, IDisposable, IExportableAs<IUserService>
{
...
}
我无法假设类的结构、接口(如果有的话)或类似内容。唯一我知道的是,我正在从用于创建此插件的共享程序集中针对
ExportableAs<T>
进行目标定位。但是,我需要动态注册类型。因此,我使用通用接口来标记要导出的类型。在这种情况下,它是
IUserService
。我这样做是假设一些巧妙的Linq查询可以给我想要的结果。但是,我遇到了一些小问题。以下是我目前的代码:
assembly.GetTypes()
.Where(t => t.GetInterfaces().Any(i =>
i.IsGenericType &&
i.GetGenericTypeDefinition() == typeof(IExportableAs<>))
).ToList()
.ForEach(t => _catalogs.Add(
new ComposablePart()
{
Name = t.FullName,
Type = t // This is incorrect
})
);
这段代码是正确的,但请注意上面的注释"This is incorrect"。这个类是
UserService
的派生类。我的最终目标是:
- 将泛型类型传递到
IExportableAs<T>
中(在本例中为IUserService
) - 派生类类型(在本例中为
UserService
)
如果你觉得我的LINQ有问题,可以随意修改。
提前感谢您!
.Select(ti => new ComposablePart() { Name = ti.t.FullName, Type = ti.i.GetGenericArguments()[0] });
否则,在ToList()时它将无法转换为已知类型。 - eduncan911GetGenericTypeDefinition()[0]
的索引有所担忧。这会限制我只能正确使用1个IExportableAs<>
,是吗? - eduncan911GetGenericTypeDefinition()[0]
- 只有一个GetGenericArguments()[0]
,它将你限制在每个泛型类型 IExportableAs<T> 中只能使用一种类型 T。如果需要更多,可以轻松扩展,但这没有意义。您可以在类上拥有任意数量的 IExportableAs<T>。 - pdri.GetGenericTypeDefinition()
将IExportableAs<T>
简单转换成IExportableAs<>
,以便进行比较。 - pdr