Указание полных имен типов
Для выполнения различных операций отражения необходимо задавать имена типов. Полное имя типа состоит из спецификации имени сборки, спецификации пространства имен и имени типа. Спецификации имен типов используются такими методами, как Type.GetType, Module.GetType, ModuleBuilder.GetType и Assembly.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 — любое допустимое имя, определяемое правилами языка.
Используйте обратную косую черту (\) в качестве escape-символа, чтобы разделить следующие маркеры при использовании в качестве части ИДЕНТИФИКАТОРа.
Маркер | Значение |
---|---|
\, |
Разделитель сборок. |
\+ |
Разделитель вложенных типов. |
\& |
Ссылочный тип. |
\* |
Тип указателя. |
\[ |
Ограничитель размерности массива. |
\] |
Ограничитель размерности массива. |
\. |
Обратная косая черта ставится перед точкой только в том случае, если точка включена в спецификацию массива. Для точек в спецификации NamespaceSpec обратная косая черта не требуется. |
\\ |
Обратная косая черта, если она используется в качестве строкового литерала. |
Во всех компонентах TypeSpec, кроме AssemblyNameSpec, имеются соответствующие пробелы. В 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 до 65 535 включительно. |
PublicKey | Полный открытый ключ | Строковое значение полного открытого ключа в шестнадцатеричном формате. Чтобы явным образом описать сборку как закрытую, необходимо задать пустую ссылку (Nothing в Visual Basic). |
PublicKeyToken | Токен открытого ключа (8-байтовый хэш-код полного открытого ключа) | Строковое значение токена открытого ключа в шестнадцатеричном формате. Чтобы явным образом описать сборку как закрытую, необходимо задать пустую ссылку (Nothing в 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'NU МБ ER представляет открытый универсальный тип с 1 по n параметров универсального типа. Например, чтобы получить ссылку на открытый универсальный тип или закрытый универсальный тип List<T>
List<String>
, используйте для получения ссылки на универсальный типDictionary<TKey,TValue>
, используйте Type.GetType("System.Collections.Generic.List`1")
Type.GetType("System.Collections.Generic.Dictionary`2")
.
Указание указателей
Спецификация SimpleTypeSpec* представляет неуправляемый указатель. Например, для получения указателя на тип MyType можно использовать вызов метода Type.GetType("MyType*")
. Для получения указателя на указатель на тип MyType используется вызов Type.GetType("MyType**")
.
Указание ссылок
Спецификация SimpleTypeSpec & представляет управляемый указатель или ссылку. Например, для получения ссылки на тип MyType можно использовать вызов Type.GetType("MyType &")
. В отличие от указателей, ссылки ограничены одним уровнем.
Указание массивов
В БНФ спецификация 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.