我有:
public class MyUserControl : WebUserControlBase <MyDocumentType>{...}
如果我在另一个类中,我如何获得MyDocumentType
的TypeName ?
你可以这样写:
typeof(MyUserControl).BaseType.GetGenericArguments()[0]
如果您知道该类直接派生自WebUserControlBase<T>
,则有很多答案显示如何获得T
的类型。如果您希望能够在层次结构中向上移动,直到遇到WebUserControlBase<T>
:
var t = typeof(MyUserControl);
while (!t.IsGenericType
|| t.GetGenericTypeDefinition() != typeof(WebUserControlBase<>))
{
t = t.BaseType;
}
然后通过反映t
的泛型类型参数来得到T
。
由于这是一个示例而不是生产代码,因此我不处理t
表示根本不派生自WebUserControlBase<T>
的类型的情况。
您可以使用Type.GetGenericArguments
方法。
返回一个Type对象数组,该数组表示的类型参数泛型类型或泛型类型定义的类型参数。
typeof(MyUserControl).BaseType.GetGenericArguments()[0]
由于此方法的返回类型为System.Type[]
,因此数组元素将按照它们在泛型类型的类型参数列表中出现的顺序返回。
如果你使用的是。net 4.5:
typeof(MyUserControl).BaseType.GenericTypeArguments.First();