使用反射获取 T 的类型名称

Posted

技术标签:

【中文标题】使用反射获取 T 的类型名称【英文标题】:Get type name of T using reflection [duplicate] 【发布时间】:2013-03-20 09:39:22 【问题描述】:

我有:

public class MyUserControl : WebUserControlBase <MyDocumentType>...

如果我在另一个班级,如何获得 MyDocumentType 的 TypeName?

【问题讨论】:

***.com/questions/557340/… 【参考方案1】:

你可以这样使用:

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

【讨论】:

【参考方案2】:

如果您知道该类直接派生自WebUserControlBase&lt;T&gt;,那么有很多答案显示如何获取T 的类型。如果您希望能够提升层次结构直到遇到WebUserControlBase&lt;T&gt;,以下是如何做到这一点:

var t = typeof(MyUserControl);
while (!t.IsGenericType
    || t.GetGenericTypeDefinition() != typeof(WebUserControlBase<>))

    t = t.BaseType;

然后通过反射t 的泛型类型参数继续得到T

由于这是一个示例而不是生产代码,我不会处理 t 表示的类型根本不是从 WebUserControlBase&lt;T&gt; 派生的情况。

【讨论】:

【参考方案3】:

你可以使用Type.GetGenericArguments方法。

返回一个 Type 对象数组,这些对象表示 泛型类型或泛型类型定义的类型参数。

喜欢

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

由于此方法的返回类型为System.Type[],因此数组元素按照它们在泛型类型参数列表中出现的顺序返回。

【讨论】:

【参考方案4】:

如果您使用的是 .NET 4.5:

typeof(MyUserControl).BaseType.GenericTypeArguments.First();

【讨论】:

这很好,但应该记住,GenericTypeArguments 属性只存在于 .NET 4.5 开始。

以上是关于使用反射获取 T 的类型名称的主要内容,如果未能解决你的问题,请参考以下文章

如何使用反射在 Task<T> 中获取 T 类型的属性?

如何在 C# 中使用反射获取类型的完全限定名称

如何反射获取List<T> 中泛型的类型

Java+反射1+获取属性/成员变量 的名称及类型

说说对java反射的理解,使用反射如何获取一个类的所有方法,使用反射需要注意哪些问题?

如何使用 Go 反射 pkg 获取切片结构字段的类型?