Specifying Fully Qualified Type Names
You must specify type names to have valid input to various reflection operations. A fully qualified type name consists of an assembly name specification, a namespace specification, and a type name. Type name specifications are used by methods such as Type.GetType, Module.GetType, ModuleBuilder.GetType, and Assembly.GetType.
Backus-Naur Form Grammar for Type Names
The Backus-Naur form (BNF) defines the syntax of formal languages. The following table lists BNF lexical rules that describe how to recognize a valid input. Terminals (those elements that are not further reducible) are shown in all uppercase letters. Nonterminals (those elements that are further reducible) are shown in mixed-case or singly quoted strings, but the single quote (') is not a part of the syntax itself. The pipe character (|) denotes rules that have subrules.
BNF grammar of fully qualified type names |
---|
TypeSpec := ReferenceTypeSpec | SimpleTypeSpec |
ReferenceTypeSpec := SimpleTypeSpec '&' |
SimpleTypeSpec := PointerTypeSpec | ArrayTypeSpec | TypeName |
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 |
Specifying Special Characters
In a type name, IDENTIFIER is any valid name determined by the rules of a language.
Use the backslash (\) as an escape character to separate the following tokens when used as part of IDENTIFIER.
Token |
Meaning |
---|---|
\, |
Assembly separator. |
\+ |
Nested type separator. |
\& |
Reference type. |
\* |
Pointer type. |
\[ |
Array dimension delimiter. |
\] |
Array dimension delimiter. |
\. |
Use the backslash before a period only if the period is used in an array specification. Periods in NamespaceSpec do not take the backslash. |
\\ |
Backslash when needed as a string literal. |
Note that in all TypeSpec components except AssemblyNameSpec, spaces are relevant. In the AssemblyNameSpec, spaces before the ',' separator are relevant, but spaces after the ',' separator are ignored.
Reflection classes, such as Type.FullName, return the mangled name so that the returned name can be used in a call to GetType, as in MyType.GetType(myType.FullName).
For example, the fully qualified name for a type might be Ozzy.OutBack.Kangaroo+Wallaby,MyAssembly.
If the namespace were Ozzy.Out+Back, then the plus sign must be preceded by a backslash. Otherwise, the parser would interpret it as a nesting separator. Reflection emits this string as Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly.
Specifying Assembly Names
The minimum information required in an assembly name specification is the textual name (IDENTIFIER) of the assembly. You can follow the IDENTIFIER by a comma-separated list of property/value pairs as described in the following table. IDENTIFIER naming should follow the rules for file naming. The IDENTIFIER is case-insensitive.
Property name |
Description |
Allowable values |
---|---|---|
Version |
Assembly version number |
Major.Minor.Build.Revision, where Major, Minor, Build, and Revision are integers between 0 and 65535 inclusive. |
PublicKey |
Full public key |
String value of full public key in hexadecimal format. Specify a null reference (Nothing in Visual Basic) to explicitly indicate a private assembly. |
PublicKeyToken |
Public key token (8-byte hash of the full public key) |
String value of public key token in hexadecimal format. Specify a null reference (Nothing in Visual Basic) to explicitly indicate a private assembly. |
Culture |
Assembly culture |
Culture of the assembly in RFC-1766 format, or "neutral" for language-independent (nonsatellite) assemblies. |
Custom |
Custom binary large object (BLOB). This is currently used only in assemblies generated by the Native Image Generator (Ngen). |
Custom string used by the Native Image Generator tool to notify the assembly cache that the assembly being installed is a native image, and is therefore to be installed in the native image cache. Also called a zap string. |
The following example shows an AssemblyName for a simply named assembly with default culture.
com.microsoft.crypto, Culture=""
The following example shows a fully specified reference for a strongly named assembly with culture "en".
com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012,
Version=1.0.0.0
The following examples each show a partially specified AssemblyName, which can be satisfied by either a strong or a simply named assembly.
com.microsoft.crypto
com.microsoft.crypto, Culture=""
com.microsoft.crypto, Culture=en
The following examples each show a partially specified AssemblyName, which must be satisfied by a simply named assembly.
com.microsoft.crypto, Culture="", PublicKeyToken=null
com.microsoft.crypto, Culture=en, PublicKeyToken=null
The following examples each show a partially specified AssemblyName, which must be satisfied by a strongly named assembly.
com.microsoft.crypto, Culture="", PublicKeyToken=a5d015c7d5a0b012
com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012,
Version=1.0.0.0
Specifying Pointers
SimpleTypeSpec* represents an unmanaged pointer. For example, to get a pointer to type MyType, use Type.GetType("MyType*"). To get a pointer to a pointer to type MyType, use Type.GetType("MyType**").
Specifying References
SimpleTypeSpec & represents a managed pointer or reference. For example, to get a reference to type MyType, use Type.GetType("MyType &"). Note that unlike pointers, references are limited to one level.
Specifying Arrays
In the BNF Grammar, ReflectionEmitDimension only applies to incomplete type definitions retrieved using ModuleBuilder.GetType. Incomplete type definitions are TypeBuilder objects constructed using Reflection.Emit but on which TypeBuilder.CreateType has not been called. ReflectionDimension can be used to retrieve any type definition that has been completed, that is, a type that has been loaded.
Arrays are accessed in reflection by specifying the rank of the array:
Type.GetType("MyArray[]") gets a single-dimension array with 0 lower bound.
Type.GetType("MyArray[*]") gets a single-dimension array with unknown lower bound.
Type.GetType("MyArray[][]") gets a two-dimensional array's array.
Type.GetType("MyArray[*,*]") and Type.GetType("MyArray[,]") gets a rectangular two-dimensional array with unknown lower bounds.
Note that from a runtime point of view, MyArray[] != MyArray[*], but for multidimensional arrays, the two notations are equivalent. That is, Type.GetType("MyArray [,]") == Type.GetType("MyArray[*,*]") evaluates to true.
For ModuleBuilder.GetType, MyArray[0..5] indicates a single-dimension array with size 6, lower bound 0. MyArray[4…] indicates a single-dimension array of unknown size and lower bound 4.