Поделиться через


Укажите полные квалифицированные имена типов

Необходимо указать имена типов, чтобы иметь допустимые входные данные для различных операций отражения. Полное имя типа состоит из спецификации имени сборки, спецификации пространства имен и имени типа. Спецификации имен типов используются такими методами, как 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
	;

Указание специальных символов

В имени типа ИДЕНТИФИКАТОР является любым допустимым именем, определенными правилами языка.

Используйте обратную косую черту (\) в качестве escape-символа, чтобы разделить следующие маркеры при использовании в качестве части ИДЕНТИФИКАТОРа.

Токен Значение
\, Разделитель сборок.
\+ Разделитель вложенных типов.
\& Ссылочный тип.
\* Тип указателя.
\[ Разделитель измерения массива.
\] Разделитель измерения массива.
\. Используйте обратный слеш перед точкой только в том случае, если точка используется в описании массива. Периоды в пространстве имен Не принимают обратную косую черту.
\\ Обратная косая черта используется при необходимости как строковая литерал.

Во всех компонентах TypeSpec, кроме AssemblyNameSpec, пробелы имеют значение. В AssemblyNameSpec пробелы перед разделителем "," имеют значение, но пробелы после "," разделителя игнорируются.

Классы отражения, такие как Type.FullName, возвращают искаженное имя, чтобы его можно было использовать в вызове GetType, как и в MyType.GetType(myType.FullName).

Например, полное имя типа может быть Ozzy.OutBack.Kangaroo+Wallaby,MyAssembly.

Если пространство имен было Ozzy.Out+Back, то знак плюса должен быть предшествован обратной косой чертой. В противном случае средство синтаксического анализа интерпретирует его как вложенный разделитель. Отражение выдает эту строку как Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly.

Укажите имена сборок

Минимальная информация, необходимая в спецификации имени сборки, — это текстовое имя (ИДЕНТИФИКАТОР) сборки. Вы можете следовать идентификатору по разделенному запятыми списку пар свойств и значений, как описано в следующей таблице. Именование идентификаторов должно соответствовать правилам именования файлов. ИДЕНТИФИКАТОР не учитывает регистр.

Название свойства Описание Допустимые значения
Версия Номер версии сборки Major.Minor.Build.Revision, где Major, Minor, Build и Revision являются целыми числами от 0 до 65535 включительно.
PublicKey Полный открытый ключ Строковое значение полного открытого ключа в шестнадцатеричном формате. Укажите пустую ссылку (Nothing в Visual Basic), чтобы явно указать частную сборку.
PublicKeyToken Маркер открытого ключа (8-байтовый хэш полного открытого ключа) Строковое значение маркера открытого ключа в шестнадцатеричном формате. Укажите пустую ссылку (Nothing в Visual Basic), чтобы явно указать частную сборку.
Культура Культура сборки Культура сборки в формате RFC-1766 или "нейтральный" для сборок, не зависящих от языка.
Настройка Настраиваемый большой двоичный объект (BLOB). В настоящее время это используется только в сборках, созданных генератором собственных образов (Ngen). Настраиваемая строка, используемая средством генератора собственных образов для уведомления кэша сборок о том, что установленная сборка является собственным образом, поэтому она должна быть установлена в собственном кэше образов. Также называется строкой zap.

В следующем примере показано имя сборки для просто именованной сборки с языком и региональными параметрами по умолчанию.

com.microsoft.crypto, Culture=""

В следующем примере показана полная ссылка на строго именованную сборку с культурой "en".

com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012,
    Version=1.0.0.0

В следующих примерах показано частично указанное имя сборки, которое может быть удовлетворено строгой или просто именованной сборкой.

com.microsoft.crypto
com.microsoft.crypto, Culture=""
com.microsoft.crypto, Culture=en

В следующих примерах показано частично указанное имя сборки, которое должно быть удовлетворено просто именованной сборкой.

com.microsoft.crypto, Culture="", PublicKeyToken=null
com.microsoft.crypto, Culture=en, PublicKeyToken=null

В следующих примерах показано частично указанное имя сборки, которое должно быть удовлетворено строго именованной сборкой.

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[]") получает одномерный массив с нулевым нижним пределом.
  • 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.

См. также