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

Необходимо указать имена типов, чтобы иметь допустимые входные данные для различных операций отражения. Полное имя типа состоит из спецификации имени сборки, спецификации пространства имен и имени типа. Спецификации имен типов используются такими методами, как Type.GetType, Module.GetTypeи ModuleBuilder.GetTypeAssembly.GetType.

Грамматика для имен типов

Грамматика определяет синтаксис формальных языков. В следующей таблице перечислены лексические правила, описывающие, как распознать допустимые входные данные. Терминалы (элементы, которые нельзя дальше упростить) отображаются во всех заглавных буквах. Нетерминалы (те элементы, которые можно еще сократить) отображаются в смешанном регистре или в одиночных кавычках, но одинарная кавычка (') не является частью самого синтаксиса. Символ вертикальной черты (|) обозначает правила, имеющие подправила.

TypeSpec
	: ReferenceTypeSpec
	| SimpleTypeSpec
	;

ReferenceTypeSpec
	: SimpleTypeSpec '&'
	;

SimpleTypeSpec
	: PointerTypeSpec
	| GenericTypeSpec
	| TypeName
	;

GenericTypeSpec
	: SimpleTypeSpec ` NUMBER
	| SimpleTypeSpec ` NUMBER '[' GenericArguments ']'
	;

GenericArguments
	: GenericArgument
	| GenericArguments ',' GenericArgument
	;

GenericArgument
	: TypeSpec
	| '[' TypeSpec ']'
	;

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>, используйте Type.GetType("System.Collections.Generic.List`1"). Чтобы получить ссылку на открытый универсальный тип Dictionary<TKey,TValue>, используйте Type.GetType("System.Collections.Generic.Dictionary`2").

Чтобы указать созданный универсальный тип , где параметры типа заменяются определенными типами, добавьте аргументы типа в квадратные скобки после arity: SimpleTypeSpec`NUMBER[TypeArg1,TypeArg2] Например, чтобы получить ссылку на List<String>, используйте Type.GetType("System.Collections.Generic.List`1[System.String]"). Чтобы получить ссылку на Dictionary<String, Int32>, используйте Type.GetType("System.Collections.Generic.Dictionary`2[System.String,System.Int32]").

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

"System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Int32, System.Private.CoreLib]]"

Аргументы типа без скобок не могут включать квалификатор сборки. Чтобы смешивать аргументы типа, квалифицированные сборкой, и неквалифицированные, оберните в квадратные скобки только первые.

"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"

Свойство Type.AssemblyQualifiedName возвращает имя типа в формате, который Type.GetType принимает. Используйте его, чтобы получить правильную отформатированную строку для любого созданного универсального типа. Например, typeof(Dictionary<string, int>).AssemblyQualifiedName возвращает полностью квалифицированное и правильно экранированное имя, которое можно передать в Type.GetType.

Укажите указатели

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.

См. также