如何反映用于继承的泛型参数

时间:2009-07-14 20:50:32

标签: c# .net generics reflection inheritance

假设我有以下类层次结构:TaskViewer继承自ListViewer<Task>,后者继承自ViewerBase

如果我调试到ViewerBase中声明的方法并查看this.GetType(),它会正确返回TaskViewer。但是,我找不到一个属性或方法,它将返回继承中使用的泛型参数,即Task。显然,如果我处于TaskViewerListViewer<T>的背景下,那么我很容易就会知道这一点。

通过查看Task属性,我可以看到它是BaseType.FullName,但我已经浏览了列表,我看不到任何东西都认为自己已经使用了这个泛型参数。

如何从根类中的此方法中获取原始泛型参数?

2 个答案:

答案 0 :(得分:6)

您可以按如下方式访问基类型的泛型参数(假设只有一个类型参数)。

typeof(TaskViewer).BaseType.GetGenericArguments()[0]

ViewerBase中你会使用

this.GetType().BaseType.GetGenericArguments()[0]

但是看起来很容易看到基类中派生类的泛型类型参数。您无法知道实际类型是什么,因此如果它根本没有泛型参数则不会。你能说一下你的使用场景吗?

答案 1 :(得分:1)

确保你这样做是有充分理由的。如果您这样做是为了将返回的类型放在if语句中并根据类型执行不同的操作,则这是用于多态,可能是通用约束,而不是反射。