如何得到所有Type <t>,其中T是多种不同的类型?</t>

时间:2015-03-10 21:20:12

标签: c# reflection

我有以下Types

IMyType,
IMyType<MyClass1>,
IMyType<MyClass2>,
IMyType<string>

使用这样的反射:

typeof(MyCurrentClass).Assembly.GetTypes()
    .Where(x => x.Name.Contains("IMyType")).ToArray()

我可以获得一个Types数组,但它只包含IMyTypeIMyType<>

我可以使用反射获取IMyType<MyClass1>等特定类型吗?

2 个答案:

答案 0 :(得分:1)

您必须解析IL以真正获得所有用法。但是,如果您满足于仅查找使用IMyTypeIMyType<>的类型和方法,则可以使用反射来枚举所有已加载程序集中的所有类型,并查看相关类型是否源自使用IMyType的{​​{1}}或IMyType<>。然后,枚举类型中的每个方法或属性,并使用相同的机制询问任何参数的类型或返回类型是从Type.IsAssignableFrom()还是IMyType派生的。这是你能做的最好的事情。

答案 1 :(得分:0)

IMyType<MyClass1>不属于您的程序集,这就是GetTypes不返回它的原因。您的程序集包含IMyType<>通用定义,您可以创建IMyType<T> T,其中IMyType<T>是任何内容(您可以从代码中执行此操作,也可以在运行时使用反射执行此操作)。这并不意味着即使其中一个也会创建新类型 - 通用定义将用于它们。

我认为没有办法检查在程序执行的任何给定时间创建的{{1}}具体实例。

您可以尝试使用静态代码分析工具扫描您的代码库,看看它被用作给定泛型类型的通用参数,但我不知道哪些工具具有该功能。