指定完全限定的类型名称

必须指定类型名称才能为各种反射操作提供有效输入。 完全限定的类型名称由程序集名称规范、命名空间规范和类型名称组成。 类型名称规范由方法(如Type.GetTypeModule.GetTypeModuleBuilder.GetTypeAssembly.GetType)使用。

类型名称的语法

语法定义正式语言的语法。 下表列出了描述如何识别有效输入的词法规则。 最终元素(无法再减小的元素)全部以大写字母显示。 非终结符(可进一步化简的那些元素)显示为混合大小写或单引号括起的字符串,但单引号(')本身并不是语法的一部分。 管道字符(|)表示具有子规则的规则。

TypeSpec
	: ReferenceTypeSpec
	| SimpleTypeSpec
	;

ReferenceTypeSpec
	: SimpleTypeSpec '&'
	;

SimpleTypeSpec
	: PointerTypeSpec
	| GenericTypeSpec
	| TypeName
	;

GenericTypeSpec
   : SimpleTypeSpec ` NUMBER

PointerTypeSpec
	: SimpleTypeSpec '*'
	;

ArrayTypeSpec
	: SimpleTypeSpec '[ReflectionDimension]'
	| SimpleTypeSpec '[ReflectionEmitDimension]'
	;

ReflectionDimension
	: '*'
	| ReflectionDimension ',' ReflectionDimension
	| NOTOKEN
	;

ReflectionEmitDimension
	: '*'
	| Number '..' Number
	| Number '…'
	| ReflectionDimension ',' ReflectionDimension
	| NOTOKEN
	;

Number
	: [0-9]+
	;

TypeName
	: NamespaceTypeName
	| NamespaceTypeName ',' AssemblyNameSpec
	;

NamespaceTypeName
	: NestedTypeName
	| NamespaceSpec '.' NestedTypeName
	;

NestedTypeName
	: IDENTIFIER
	| NestedTypeName '+' IDENTIFIER
	;

NamespaceSpec
	: IDENTIFIER
	| NamespaceSpec '.' IDENTIFIER
	;

AssemblyNameSpec
	: IDENTIFIER
	| IDENTIFIER ',' AssemblyProperties
	;

AssemblyProperties
	: AssemblyProperty
	| AssemblyProperties ',' AssemblyProperty
	;

AssemblyProperty
	: AssemblyPropertyName '=' AssemblyPropertyValue
	;

指定特殊字符

在类型名称中,IDENTIFIER 是由语言规则确定的任何有效名称。

反斜杠 (\) 可用作转义字符来分隔以下用作 IDENTIFIER 一部分的标记。

令牌 含义
\, 程序集分隔符。
\+ 嵌套类型分隔符。
\& 引用类型。
\* 指针类型。
\[ 数组维度分隔符。
\] 数组维度分隔符。
\. 只有在数组规范中使用句点时,才应在句点前使用反斜杠。 NamespaceSpec 中的句点不使用反斜杠。
\\ 必要时将反斜杠用作字符串文本。

除 AssemblyNameSpec 之外的所有 TypeSpec 组件中,空格都相关。 在 AssemblyNameSpec 中,“”分隔符之前的空格是相关的,但“,分隔符后面的空格将被忽略。

反射类(如 Type.FullName)返回混淆的名称,以便返回的名称可以在调用 GetType 时使用,如在 MyType.GetType(myType.FullName) 中所示。

例如,类型的完全限定名称可能是 Ozzy.OutBack.Kangaroo+Wallaby,MyAssembly

如果命名空间是 Ozzy.Out+Back,则加号前面必须有反斜杠。 否则,分析器会将其解释为嵌套分隔符。 反射将发出此字符串作为 Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly.

指定程序集名称

程序集名称规范中所需的最小信息是程序集的文本名称(IDENTIFIER)。 可以在 IDENTIFIER 后添加下表所述的以逗号分隔的属性/值对列表。 标识符命名应遵循文件命名规则。 IDENTIFIER 不区分大小写。

属性名称 DESCRIPTION 允许的值
版本 程序集版本号 Major.Minor.Build.Revision,其中 MajorMinorBuildRevision 是介于 0 和 65535 之间的整数(含 65535)。
PublicKey 完整公钥 以十六进制格式表示的完整公钥的字符串值。 指定空引用(Visual Basic 中没有任何内容 )以显式指示私有程序集。
PublicKeyToken 公钥令牌(完整公钥的 8 字节哈希) 公钥令牌的字符串值(采用十六进制格式)。 指定空引用(Visual Basic 中没有任何内容 )以显式指示私有程序集。
文化 集会文化 RFC-1766 格式的程序集区域性,对于独立于语言(非附属)的程序集则为“非特定”。
自定义 自定义二进制大型对象(BLOB)。 它当前仅用于由本机图像生成器 (Ngen) 生成的程序集。 本机映像生成器工具使用的自定义字符串,用于通知程序集缓存所安装的程序集是本机映像,因此应安装在本机映像缓存中。 也称作 zap 字符串。

下面的示例演示具有默认区域性的简单命名程序集的 AssemblyName

com.microsoft.crypto, Culture=""

下面的示例演示区域性为“en”的强名称程序集的完全指定的引用。

com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012,
    Version=1.0.0.0

下面的示例演示部分指定的 AssemblyName,它可以由具有强名称或简单名称的程序集来满足

com.microsoft.crypto
com.microsoft.crypto, Culture=""
com.microsoft.crypto, Culture=en

下面的示例分别演示一个部分指定的 AssemblyName,它必须由具有简单名称的程序集来满足

com.microsoft.crypto, Culture="", PublicKeyToken=null
com.microsoft.crypto, Culture=en, PublicKeyToken=null

下面的示例分别演示一个部分指定的 AssemblyName,它必须由具有强名称的程序集来满足

com.microsoft.crypto, Culture="", PublicKeyToken=a5d015c7d5a0b012
com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012,
    Version=1.0.0.0

指定泛型类型

SimpleTypeSpec NUMBER 表示具有从 1 到 n 泛型类型参数的开放式泛型类型。 例如,若要获取对打开泛型类型List<T>或封闭泛型类型List<String>的引用,请使用Type.GetType("System.Collections.Generic.List`1")。若要获取对泛型类型Dictionary<TKey,TValue>的引用,请使用Type.GetType("System.Collections.Generic.Dictionary`2")

指定指针

SimpleTypeSpec* 表示非托管指针。 例如,若要获取指向 MyType 类型的指针,请使用 Type.GetType("MyType*")。 要获取指向 MyType 类型指针的指针,请使用 Type.GetType("MyType**")

指定引用

SimpleTypeSpec & 表示托管指针或引用。 例如,若要获取对 MyType 类型的引用,请使用 Type.GetType("MyType &")。 与指针不同,引用限制为一个级别。

指定数组

在 BNF 语法中,ReflectionEmitDimension 仅适用于通过 ModuleBuilder.GetType 获取的不完整类型定义。 不完整类型定义是使用 TypeBuilder 构造但没有对其调用 System.Reflection.EmitTypeBuilder.CreateType 对象。 ReflectionDimension 可用于检索已完成的任何类型定义,即已加载的类型。

通过指定数组的级别,可以访问反射中的数组:

  • Type.GetType("MyArray[]") 获取具有 0 下限的单维数组。
  • Type.GetType("MyArray[*]") 获取具有未知下限的单维数组。
  • Type.GetType("MyArray[][]") 获取二维数组的数组。
  • Type.GetType("MyArray[*,*]")Type.GetType("MyArray[,]") 获取具有未知下限的矩形二维数组。

从运行时的角度来看, MyArray[] != MyArray[*]但对于多维数组,这两个表示法是等效的。 也就是说, Type.GetType("MyArray [,]") == Type.GetType("MyArray[*,*]") 计算结果为 true

对于 ModuleBuilder.GetTypeMyArray[0..5] 指示大小为 6、下限为 0 的单维数组。 MyArray[4…] 指示未知大小和下限 4 的单维数组。

另请参阅