Указание полных имен типов
Обновлен: Ноябрь 2007
Для выполнения различных операций отражения необходимо задать имена типов. Полное имя типа состоит из спецификации имени сборки, спецификации пространства имен и имени типа. Спецификации имен типов используются такими методами, как Type.GetType, Module.GetType, ModuleBuilder.GetType и Assembly.GetType.
Форма Бэкуса-Наура для имен типов
Форма Бэкуса-Наура (БНФ) определяет синтаксис формальных языков. Следующая таблица содержит список лексических правил БНФ, описывающих порядок распознавания допустимых входных данных. Терминальные слова (элементы, дальнейшее приведение которых невозможно) отображаются прописными буквами. Нетерминальные слова (допускающие преобразование) содержат прописные буквы вместе со строчными или заключены в апострофы, причем апострофы (') не являются частью синтаксиса. Знак вертикальной черты (|) обозначает правила, у которых есть подправила.
Грамматика БНФ для полных имен типов |
---|
TypeSpec := ReferenceTypeSpec SimpleTypeSpec |
ReferenceTypeSpec := SimpleTypeSpec '&' |
SimpleTypeSpec := PointerTypeSpec | ArrayTypeSpec | TypeName |
PointerTypeSpec := SimpleTypeSpec '*' |
ArrayTypeSpec := SimpleTypeSpec '[ReflectionDimension]' | SimpleTypeSpec '[ReflectionEmitDimension]' |
ReflectionDimension := '*' | ReflectionDimension ',' ReflectionDimension | NOTOKEN |
ReflectionEmitDimension := '*' | 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 отделяются 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 не различаются.
Имя свойства |
Описание |
Допустимые значения |
---|---|---|
Версия |
Номер версии сборки |
Major.Minor.Build.Revision, где Major, Minor, Build и Revision являются целочисленными значениями в диапазоне от 0 до 65535 включительно. |
PublicKey |
Полный открытый ключ |
Строковое значение полного открытого ключа в шестнадцатеричном формате. Чтобы явным образом описать сборку как закрытую, необходимо задать пустую ссылку (Nothing в Visual Basic). |
PublicKeyToken |
Маркер открытого ключа (8-байтный хэш-код полного открытого ключа) |
Строковое значение маркера открытого ключа в шестнадцатеричном формате. Чтобы явным образом описать сборку как закрытую, необходимо задать пустую ссылку (Nothing в Visual Basic). |
Язык и региональные параметры |
Язык и региональные параметры сборки |
Язык и региональные параметры сборки в формате RFC-1766 или нейтральная среда для сборок, независимых от языков (не сопутствующих). |
Custom |
Пользовательский 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* представляет неуправляемый указатель. Например, для получения указателя на тип MyType можно использовать вызов метода Type.GetType("MyType*"). Для получения указателя на указатель на тип MyType используется вызов Type.GetType("MyType**").
Указание ссылок
Спецификация SimpleTypeSpec & представляет управляемый указатель или ссылку. Например, для получения ссылки на тип MyType можно использовать вызов Type.GetType("MyType &"). Обратите внимание, что ссылки, в отличие от указателей, ограничены одним уровнем.
Указание массивов
В БНФ спецификация ReflectionEmitDimension применяется только в отношении неполных типов, извлеченных с использованием метода ModuleBuilder.GetType. К определениям неполных типов относятся объекты TypeBuilder, созданные с использованием метода 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.GetTypeMyArray[0..5] указывает одномерный массив размером 6 с нижней границей 0. MyArray[4…] указывает одномерный массив неизвестного размера с нижней границей 4.