必须指定类型名称才能为各种反射操作提供有效输入。 完全限定的类型名称由程序集名称规范、命名空间规范和类型名称组成。 类型名称规范由方法(如Type.GetType、Module.GetType和ModuleBuilder.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,其中 Major、 Minor、 Build 和 Revision 是介于 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.Emit 的 TypeBuilder.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.GetType
, MyArray[0..5]
指示大小为 6、下限为 0 的单维数组。
MyArray[4…]
指示未知大小和下限 4 的单维数组。