导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

Type.GetType 方法 (String)

2013/12/13

获取具有指定名称的 Type,执行区分大小写的搜索。

Namespace:  System
程序集:  mscorlib(位于 mscorlib.dll 中)

public static Type GetType(
	string typeName
)

参数

typeName
类型: System.String
要获取的类型的程序集限定名称。请参见AssemblyQualifiedName。如果该类型位于当前正在执行的程序集中或者 Mscorlib.dll 中,则提供由命名空间限定的类型名称就足够了。

返回值

类型: System.Type
具有指定名称的 Type(如果找到的话);否则为 null

异常条件
ArgumentNullException

typeNamenull

TargetInvocationException

调用类初始值设定项并引发异常。

ArgumentException

typeName 表示具有指针类型、ByRef 类型或 Void 作为其类型参数之一的泛型类型。

- 或 -

typeName 表示具有不正确数量的类型参数的泛型类型。

- 或 -

typeName 表示泛型类型,其类型参数之一不满足对应类型参数的约束

FileNotFoundException

未找到该程序集或它的某个依赖项。

FileLoadException

找到了该程序集或它的某个依赖项,但是无法加载它们。

BadImageFormatException

该程序集或它的某个依赖项无效。

- 或 -

使用 .NET Framework 的更高版本对该程序集进行了编译。

您可以使用 GetType 方法来获取另一个程序集中某个类型的 Type 对象(如果您知道该程序集的命名空间限定名称)。GetType 会导致加载 typeName 中所指定的程序集。您还可以使用 Load 方法来加载程序集,然后使用 Assembly 类的 GetTypeGetTypes 方法来获取 Type 对象。如果在编译时,程序集中的类型对于您的程序来说是已知的,则使用 typeof(在 C# 中)、GetType(在 Visual Basic 中)或 typeid(在 C++ 中)更为高效。

下表显示当反映到某个类型时,Get 方法返回基类的哪些成员。

成员类型

静态

非静态

构造函数

字段

是。字段总是按名称和签名隐藏。

事件

不适用

常规类型系统规则是:该继承与实现属性的方法的继承相同。反射将属性视为按名称和签名隐藏。请参见下面的“注意 2”。

方法

是。方法(虚方法和非虚方法)可按名称隐藏或按名称和签名隐藏。

嵌套类型

属性

不适用

常规类型系统规则是:该继承与实现属性的方法的继承相同。反射将属性视为按名称和签名隐藏。请参见下面的“注意 2”。

说明:

  1. 按名称和签名隐藏会考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、标记和非托管调用约定。这是二进制比较。

  2. 对于反射,属性和事件按名称和签名隐藏。如果基类中有同时带 get 访问器和 set 访问器的属性,但派生类中仅有 get 访问器,则派生类属性隐藏基类属性,并且您将无法访问基类的设置程序。

  3. 自定义特性不是常规类型系统的组成部分。

不对数组或 COM 类型执行搜索,除非已将它们加载到可用类表中。

typeName 可以是由命名空间限定的类型名称,也可以是包含程序集名称规范的程序集限定名称。请参见 AssemblyQualifiedName

如果 typeName 包含命名空间,而不包含程序集名称,则此方法将只是以该顺序搜索调用对象的程序集以及 Mscorlib.dll。如果 typeName 是用部分或完整的程序集名称完全限定的,则此方法将在指定的程序集中进行搜索。如果程序集具有强名称,则需要完整的程序集名称。

AssemblyQualifiedName 属性返回完全限定的类型名称(包括嵌套类型、程序集名称和泛型类型参数)。所有支持公共语言运行时的编译器将发出嵌套类的简单名称,并且当被查询时,反射将依照下列约定构造一个 mangled 名称。

分隔符

含义

反斜杠 (\)

转义符。

反引号 (`)

位于泛型类型名称末尾处的一个或多个数字之前,这些数字表示类型参数的数目。

中括号 ([])

将已构造泛型类型的泛型类型参数列表括在括号内;在类型参数列表内,将程序集限定类型括在括号内。

逗号 (,)

位于程序集名称前。

句点 (.)

表示命名空间标识符。

加号 (+)

位于嵌套类前。

例如,类的完全限定名可能类似于如下形式:

TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly

如果命名空间为 TopNamespace.Sub+Namespace,则该字符串就必须在加号 (+) 前加转义符 (\),以防止将加号解释成嵌套分隔符。反射按如下形式发出该字符串:

TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly

“++”变成“\+\+”,而“\”变成“\\”。

可以保持此限定名并在以后使用它来加载 Type。若要搜索和加载 Type,请只结合类型名或者结合程序集限定类型名使用 GetType。只结合类型名时,GetType 将只在调用方的程序集中查找 Type,然后再在系统程序集中查找。结合程序集限定类型名时,GetType 将在所有程序集中查找 Type

类型名可能包含尾部字符,尾部字符表示有关该类型的附加信息,如类型是引用类型、指针类型还是数组类型。若要检索不具有这些尾随字符的类型名称,请使用 t.GetElementType().ToString(),其中 t 为类型。

在除程序集名称之外的所有类型名称组成部分中,空格都相关。在程序集名称中,“,”分隔符之前的空格相关,但“,”分隔符之后的空格将被忽略。

泛型类型的名称以反引号 (`) 结尾,后跟表示泛型类型参数数目的数字。之所以进行这样的名称重整,是为了允许编译器支持出现在同一范围内名称相同但类型参数数目不同的泛型类型。例如,反射功能从泛型方法 Tuple(Of T)Tuple(Of T0, T1)(在 Visual Basic 中)或 Tuple<T> 和 Tuple<T0, T1> (在 Visual C# 中)返回重整后的名称 Tuple`1Tuple`2

对于泛型类型,类型参数列表括在中括号内,类型参数之间用逗号隔开。例如,泛型 Dictionary<TKey, TValue> 有两个类型参数。键类型为 StringMyTypeDictionary<TKey, TValue> 可以表示为如下形式:

System.Collections.Generic.Dictionary`2[System.String,MyType]

若要在类型参数列表中指定程序集限定类型,请将程序集限定类型括在中括号内。否则,分隔程序集限定名称的逗号将被解释为限制其他类型参数。例如,可以按如下方式指定 MyAssembly.dll 中 MyTypeDictionary<TKey, TValue>(具有 String 类型的键):

Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
说明注意:

只有当程序集限定类型出现在类型参数列表中时,才可以将它括在中括号内。在程序集中搜索类型参数列表中限定类型和非限定类型的规则与搜索限定非通用类型和非限定非通用类型的规则相同。

可以为 Null 的类型是泛型类型的特例。例如,可为 Null 的 Int32 由字符串“System.Nullable`1[System.Int32]”表示。

说明注意:

在 C#、C++ 和 Visual Basic 中,还可以使用类型运算符来获取可以为 Null 的类型。例如,可为 Null 的 Boolean 类型由 typeof(Nullable<bool>)(在 C# 中)、Nullable<Boolean>::typeid(在 C++ 中)和 GetType(Nullable(Of Boolean))(在 Visual Basic 中)返回。

下表显示用于各种类型的 GetType 的语法。

若要获取

使用

可为 Null 的 Int32

Type.GetType("System.Nullable`1[System.Int32]")

指向 MyType 的非托管指针

Type.GetType("MyType*")

指向 MyType 指针的非托管指针

Type.GetType("MyType**")

指向 MyType 的托管指针或引用

Type.GetType("MyType&")。请注意,与指针不同,引用仅限于一个级别。

父类和嵌套类

Type.GetType("MyParentClass+MyNestedClass")

下限为 0 的一维数组

Type.GetType("MyType[]")

下限未知的一维数组

Type.GetType("MyType[*]")

n 维数组

逗号 (,) 在中括号中一共出现 n-1 次。例如,System.Object[,,] 表示一个三维 Object 数组。

一维数组的数组

Type.GetType("MyType[][]")

下限未知的矩形二维数组

Type.GetType("MyType[,]")

具有一个类型参数的泛型类型

Type.GetType("MyGenericType`1[MyType]")

具有两个类型参数的泛型类型

Type.GetType("MyGenericType`2[MyType,AnotherType]")

具有两个程序集限定类型参数的泛型类型

Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]")

具有程序集限定类型参数的程序集限定泛型类型

Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly")

一个泛型类型,其类型参数是具有两个类型参数的泛型类型

Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]")

版本说明

Windows Phone

 如果向 GetType 传递无效的参数,则不会总是引发 ArgumentException 异常。捕捉类型 Exception 的异常以捕获意外的异常。

下面的示例检索 System.Int32 的类型并使用该类型对象来显示 FullNameSystem.Int32 属性。

说明注意:

要运行此示例,请参见生成具有静态 Windows Phone TextBlock 控件的示例


using System;
class Example
{
    public static void Demo(System.Windows.Controls.TextBlock outputBlock)
    {
        try
        {
            // Get the type of a specified class.
            Type myType1 = Type.GetType("System.Int32");
            outputBlock.Text += String.Format("The full name is {0}.", myType1.FullName) + "\n";
            // Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
            Type myType2 = Type.GetType("NoneSuch", true);
            outputBlock.Text += String.Format("The full name is {0}.", myType2.FullName) + "\n";
        }
        catch (TypeLoadException e)
        {
            outputBlock.Text += e.Message + "\n";
        }
        catch (Exception e)
        {
            outputBlock.Text += e.Message + "\n";
        }
    }
}

/* This example produces output similar to the following:

The full name is System.Int32.
Could not load type 'NoneSuch' from assembly 'SilverlightApplication, Version=0.0.0.0, Culture = neutral, PublicKeyToken=null'.
 */


Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

显示:
© 2014 Microsoft