我有以下Types
:
IMyType,
IMyType<MyClass1>,
IMyType<MyClass2>,
IMyType<string>
使用这样的反射:
typeof(MyCurrentClass).Assembly.GetTypes()
.Where(x => x.Name.Contains("IMyType")).ToArray()
我可以获得一个Types
数组,但它只包含IMyType
和IMyType<>
。
我可以使用反射获取IMyType<MyClass1>
等特定类型吗?
答案 0 :(得分:1)
您必须解析IL以真正获得所有用法。但是,如果您满足于仅查找使用IMyType
或IMyType<>
的类型和方法,则可以使用反射来枚举所有已加载程序集中的所有类型,并查看相关类型是否源自使用IMyType
的{{1}}或IMyType<>
。然后,枚举类型中的每个方法或属性,并使用相同的机制询问任何参数的类型或返回类型是从Type.IsAssignableFrom()
还是IMyType
派生的。这是你能做的最好的事情。
答案 1 :(得分:0)
IMyType<MyClass1>
不属于您的程序集,这就是GetTypes
不返回它的原因。您的程序集包含IMyType<>
通用定义,您可以创建IMyType<T>
T
,其中IMyType<T>
是任何内容(您可以从代码中执行此操作,也可以在运行时使用反射执行此操作)。这并不意味着即使其中一个也会创建新类型 - 通用定义将用于它们。
我认为没有办法检查在程序执行的任何给定时间创建的{{1}}具体实例。
您可以尝试使用静态代码分析工具扫描您的代码库,看看它被用作给定泛型类型的通用参数,但我不知道哪些工具具有该功能。