Определение полных имен типов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.GetType, Module.GetType, ModuleBuilder.GetType и Assembly.GetType.Type name specifications are used by methods such as Type.GetType, Module.GetType, ModuleBuilder.GetType, and Assembly.GetType.

Грамматика для имен типовGrammar for type names

Эта грамматика определяет синтаксис формальных языков.The grammar defines the syntax of formal languages. Приведенная ниже таблица содержит список лексических правил, описывающих порядок распознавания допустимых входных данных.The following table lists 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.

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
    ;

Определение специальных символовSpecifying special characters

В имени типа IDENTIFIER — любое допустимое имя, определяемое правилами языка.In a type name, IDENTIFIER is any valid name determined by the rules of a language.

Приведенные ниже лексемы при использовании в составе IDENTIFIER отделяются escape-символом в виде обратной косой черты (\).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. Для точек в спецификации NamespaceSpec обратная косая черта не требуется.Periods in NamespaceSpec do not take the backslash.
\|Обратная косая черта, если она используется в качестве строкового литерала.\|Backslash when needed as a string literal.

Следует заметить, что для всех компонентов спецификации TypeSpec, кроме AssemblyNameSpec, пробелы существенны.Note that in all TypeSpec components except AssemblyNameSpec, spaces are relevant. В AssemblyNameSpec пробелы перед разделителем "," существенны, а пробелы после "," игнорируются.In the AssemblyNameSpec, spaces before the ',' separator are relevant, but spaces after the ',' separator are ignored.

Классы отражения, такие как Type.FullName, возвращают искаженное имя, которое можно использовать при вызове метода GetType, например MyType.GetType(myType.FullName).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).

Например, полное имя типа может иметь следующий вид: Ozzy.OutBack.Kangaroo+Wallaby,MyAssembly.For example, the fully qualified name for a type might be Ozzy.OutBack.Kangaroo+Wallaby,MyAssembly.

Если бы использовалось пространство имен Ozzy.Out+Back, перед плюсом должна была бы стоять обратная косая черта.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. Отражение порождает эту строку в следующем виде: Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly.Reflection emits this string as Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly.

Определение имен сборокSpecifying assembly names

Единственным обязательным компонентом спецификации имени сборки является текстовое имя сборки (IDENTIFIER).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 должно удовлетворять правилам именования файлов.IDENTIFIER naming should follow the rules for file naming. Регистр символов в имени IDENTIFIER не учитывается.The IDENTIFIER is case-insensitive.

Имя свойства.Property name ОписаниеDescription Допустимые значенияAllowable values
ВерсияVersion Номер версии сборкиAssembly version number Major.Minor.Build.Revision, где Major, Minor, Build и Revision являются целочисленными значениями в диапазоне от 0 до 65 535 включительно.Major.Minor.Build.Revision, where Major, Minor, Build, and Revision are integers between 0 and 65535 inclusive.
PublicKeyPublicKey Полный открытый ключFull public key Строковое значение полного открытого ключа в шестнадцатеричном формате.String value of full public key in hexadecimal format. Чтобы явным образом описать сборку как закрытую, необходимо задать пустую ссылку (Nothing в Visual Basic).Specify a null reference (Nothing in Visual Basic) to explicitly indicate a private assembly.
PublicKeyTokenPublicKeyToken Токен открытого ключа (8-байтовый хэш-код полного открытого ключа)Public key token (8-byte hash of the full public key) Строковое значение токена открытого ключа в шестнадцатеричном формате.String value of public key token in hexadecimal format. Чтобы явным образом описать сборку как закрытую, необходимо задать пустую ссылку (Nothing в Visual Basic).Specify a null reference (Nothing in Visual Basic) to explicitly indicate a private assembly.
Язык и региональные параметрыCulture Язык и региональные параметры сборкиAssembly culture Язык и региональные параметры сборки в формате RFC-1766 или нейтральная среда для сборок, независимых от языков (не сопутствующих).Culture of the assembly in RFC-1766 format, or "neutral" for language-independent (nonsatellite) assemblies.
ПользовательскийCustom Пользовательский BLOB-объект.Custom binary large object (BLOB). В настоящее время используется только в сборках, созданных генератором образов в машинном коде (Ngen).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. Также называется zap-строкой.Also called a zap string.

В приведенном ниже примере демонстрируется спецификация AssemblyName для сборки с простым именем, а также заданными по умолчанию языком и региональными параметрами.The following example shows an AssemblyName for a simply named assembly with default culture.

com.microsoft.crypto, Culture=""

В приведенном ниже примере показана полностью определенная ссылка на сборку со строгим именем, для которой установлены язык и региональные параметры —"en".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

В каждом из приведенных ниже примеров приводится частично определенное имя AssemblyName, которое подходит для сборки как с простым, так и со строгим именем.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

В каждом из приведенных ниже примеров приводится частично определенное имя AssemblyName, которое подходит только для сборки с простым именем.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

В каждом из приведенных ниже примеров приводится частично определенное имя AssemblyName, которое подходит только для сборки со строгим именем.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 generic types

SimpleTypeSpec`NUMBER представляет открытый универсальный тип с параметрами универсального типа от 1 до n.SimpleTypeSpec`NUMBER represents an open generic type with from 1 to n generic type parameters. Например, чтобы получить ссылку на List<T> для открытого универсального типа или List<String> для закрытого универсального типа, используйте Type.GetType("System.Collections.Generic.List`1"). Чтобы получить ссылку на Dictionary<TKey,TValue> для универсального типа, используйте Type.GetType("System.Collections.Generic.Dictionary`2").For example, to get reference to the open generic type List<T> or the closed generic type List<String>, use Type.GetType("System.Collections.Generic.List`1") To get a reference to the generic type Dictionary<TKey,TValue>, use Type.GetType("System.Collections.Generic.Dictionary`2").

Определение указателейSpecifying pointers

Спецификация SimpleTypeSpec* представляет неуправляемый указатель.SimpleTypeSpec* represents an unmanaged pointer. Например, для получения указателя на тип MyType можно использовать вызов метода Type.GetType("MyType*").For example, to get a pointer to type MyType, use Type.GetType("MyType*"). Для получения указателя на указатель на тип MyType используется вызов Type.GetType("MyType**").To get a pointer to a pointer to type MyType, use Type.GetType("MyType**").

Определение ссылокSpecifying references

Спецификация SimpleTypeSpec & представляет управляемый указатель или ссылку.SimpleTypeSpec & represents a managed pointer or reference. Например, для получения ссылки на тип MyType можно использовать вызов Type.GetType("MyType &").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

В БНФ спецификация ReflectionEmitDimension применяется только в отношении неполных определений типов, полученных с использованием метода ModuleBuilder.GetType.In the BNF Grammar, ReflectionEmitDimension only applies to incomplete type definitions retrieved using ModuleBuilder.GetType. К неполным определениям типов относятся объекты TypeBuilder, созданные с помощью метода System.Reflection.Emit, но для которых не был выполнен вызов TypeBuilder.CreateType.Incomplete type definitions are TypeBuilder objects constructed using System.Reflection.Emit but on which TypeBuilder.CreateType has not been called. Спецификацию ReflectionDimension можно использовать для получения любого полного определения типа, то есть типа, который уже загружен.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[]") — получение одномерного массива с нижней границей 0.Type.GetType("MyArray[]") gets a single-dimension array with 0 lower bound.

  • Type.GetType("MyArray[*]") — получение одномерного массива с неизвестной нижней границей.Type.GetType("MyArray[*]") gets a single-dimension array with unknown lower bound.

  • Type.GetType("MyArray[][]") — получение массива двумерных массивов.Type.GetType("MyArray[][]") gets a two-dimensional array's array.

  • Type.GetType("MyArray[*,*]") и Type.GetType("MyArray[,]") — получение прямоугольного двумерного массива с неизвестными нижними границами.Type.GetType("MyArray[*,*]") and Type.GetType("MyArray[,]") gets a rectangular two-dimensional array with unknown lower bounds.

Обратите внимание, что с точки зрения среды выполнения MyArray[] != MyArray[*], но для многомерных массивов эти обозначения эквивалентны.Note that from a runtime point of view, MyArray[] != MyArray[*], but for multidimensional arrays, the two notations are equivalent. Другими словами, выражение Type.GetType("MyArray [,]") == Type.GetType("MyArray[*,*]") дает значение true.That is, Type.GetType("MyArray [,]") == Type.GetType("MyArray[*,*]") evaluates to true.

Для метода ModuleBuilder.GetType MyArray[0..5] указывает одномерный массив размером 6 с нижней границей 0.For ModuleBuilder.GetType, MyArray[0..5] indicates a single-dimension array with size 6, lower bound 0. MyArray[4…] указывает одномерный массив неизвестного размера с нижней границей 4.MyArray[4…] indicates a single-dimension array of unknown size and lower bound 4.

См. такжеSee also