如何反映具有泛型接口的类型,并获得该类型的泛型

edu*_*911 5 linq generics types

我的第一个目标是使用泛型基于特定接口过滤类型.

我的第二个目标是获取泛型参数本身的类型.

public UserService : IUserService, IDisposable, IExportableAs<IUserService>
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

我不能假设类的结构,它的接口(如果有的话)或类似的.我知道的唯一一件事就是我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
            })
        );
Run Code Online (Sandbox Code Playgroud)

这是有效的,但请注意上面的评论"这是不正确的".这种类型是派生类UserService.

我最终的结果是:

  • 泛型类型传入IExportableAs<T>(IUserService在这种情况下)
  • 派生类类型(在本例中为UserService)

这个问题得到了很好的投票,因为它使我接近(如上所示):如何确定类型是否实现了特定的通用接口类型 但是,我需要更进一步找到该泛型类型.

随意修改上面的linq.

提前致谢!

pdr*_*pdr 4

知道了

assembly.GetTypes().SelectMany(t => t.GetInterfaces(), (t, i) => new { t, i })
    .Where(ti => ti.i.IsGenericType &&
                 ti.i.GetGenericTypeDefinition() == (typeof(IExportableAs<>)))
    .Select(ti => new ComposablePart() {
        Name = ti.t.FullName,
        Type = ti.i.GetGenericArguments()[0]
    });
Run Code Online (Sandbox Code Playgroud)

[编辑] 在我的兴奋中,我没有让我的测试程序运行足够长的时间来在不通用的接口上抛出异常。我认为 .NET Framework 在这方面特别聪明。现在更正了代码,我知道它不是。