Partilhar via


Especificar nomes de tipo totalmente qualificados

Você deve especificar nomes de tipo para ter entrada válida para várias operações de reflexão. Um nome de tipo totalmente qualificado consiste em uma especificação de nome de assembly, uma especificação de namespace e um nome de tipo. As especificações de nome de tipo são usadas por métodos como Type.GetType, Module.GetType, ModuleBuilder.GetTypee Assembly.GetType.

Gramática para nomes de tipo

A gramática define a sintaxe das linguagens formais. A tabela a seguir lista regras lexicais que descrevem como reconhecer uma entrada válida. Os terminais (os elementos que não são mais redutíveis) são mostrados em letras maiúsculas. Os não-terminais (os elementos que são mais redutíveis) são mostrados em cadeias de caracteres mistos ou entre aspas únicas, mas a aspa única (') não faz parte da sintaxe em si. O caractere pipe (|) denota regras que têm subregras.

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
	;

Especificar caracteres especiais

Em um nome de tipo, IDENTIFIER é qualquer nome válido determinado pelas regras de um idioma.

Use a barra invertida (\) como um caractere de escape para separar os seguintes tokens quando usados como parte de IDENTIFIER.

Símbolo Significado
\, Separador de montagem.
\+ Separador de tipo aninhado.
\& Tipo de referência.
\* Tipo de ponteiro.
\[ Delimitador de dimensão de matriz.
\] Delimitador de dimensão de matriz.
\. Use a barra invertida antes de um ponto apenas se o ponto for usado numa especificação de matriz. Os períodos em NamespaceSpec não aceitam a barra invertida.
\\ Barra invertida quando necessário como texto literal.

Em todos os componentes TypeSpec, exceto AssemblyNameSpec, os espaços são relevantes. No AssemblyNameSpec, os espaços antes do separador '' são relevantes, mas os espaços após o separador '' são ignorados.

Classes de reflexão, como Type.FullName, retornam o nome distorcido para que o nome retornado possa ser usado em uma chamada para GetType, como em MyType.GetType(myType.FullName).

Por exemplo, o nome totalmente qualificado para um tipo pode ser Ozzy.OutBack.Kangaroo+Wallaby,MyAssembly.

Se o namespace fosse Ozzy.Out+Back, então o sinal de adição deve ser precedido por uma barra invertida. Caso contrário, o analisador interpretá-lo-ia como um separador de aninhamento. A reflexão emite essa cadeia de caracteres como Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly.

Especificar nomes de conjuntos

A informação mínima exigida em uma especificação de nome de assembly é o nome textual (IDENTIFIER) do assembly. Você pode seguir o IDENTIFICADOR por uma lista separada por vírgulas de pares propriedade/valor, conforme descrito na tabela a seguir. A nomenclatura IDENTIFIER deve seguir as regras para nomenclatura de arquivos. O IDENTIFIER não diferencia maiúsculas de minúsculas.

Nome da propriedade Descrição Valores permitidos
Versão Número da versão do assembly Major.Minor.Build.Revision, onde Major, Minor, Build e Revision são inteiros entre 0 e 65535 inclusive.
Chave Pública Chave pública completa Valor da cadeia de caracteres da chave pública completa em formato hexadecimal. Especifique uma referência nula (Nothing no Visual Basic) para indicar explicitamente um assembly privado.
PublicKeyToken Token de chave pública (hash de 8 bytes da chave pública completa) Valor da cadeia de caracteres do token de chave pública em formato hexadecimal. Especifique uma referência nula (Nothing no Visual Basic) para indicar explicitamente um assembly privado.
Cultura Cultura de montagem Cultura da montagem no formato RFC-1766, ou "neutro" para montagens independentes da linguagem (não satélite).
Personalizado Objeto binário grande (BLOB) personalizado. Atualmente, isso é usado apenas em assemblies gerados pelo Native Image Generator (Ngen). Cadeia de caracteres personalizada utilizada pela ferramenta Native Image Generator para notificar o cache de assembly de que a assembly que está a ser instalada é uma imagem nativa e, portanto, deve ser armazenada no cache de imagens nativas. Também chamada de string zap.

O exemplo a seguir mostra um AssemblyName para um assembly com nome simples e cultura padrão.

com.microsoft.crypto, Culture=""

O exemplo a seguir mostra uma referência totalmente especificada para um assembly com nome forte com a cultura "en".

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

Cada um dos exemplos a seguir mostra um AssemblyName parcialmente especificado, que pode ser satisfeito por um assembly com nome forte ou nome simples.

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

Os exemplos abaixo mostram um AssemblyName parcialmente especificado, que deve ser atendido por um assembly de nome simples.

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

Cada um dos exemplos a seguir mostra um AssemblyName parcialmente especificado, que precisa ser correspondido por um assembly fortemente nomeado.

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

Especificar tipos genéricos

SimpleTypeSpec'NUMBER representa um tipo genérico aberto com de 1 a n parâmetros de tipo genérico. Por exemplo, para obter referência ao tipo List<T> genérico aberto ou ao tipo List<String>genérico fechado , use Type.GetType("System.Collections.Generic.List`1") Para obter uma referência ao tipo Dictionary<TKey,TValue>genérico , use Type.GetType("System.Collections.Generic.Dictionary`2").

Especificar ponteiros

SimpleTypeSpec* representa um ponteiro não gerenciado. Por exemplo, para obter um ponteiro para digitar MyType, use Type.GetType("MyType*"). Para obter um ponteiro para um ponteiro do tipo MyType, use Type.GetType("MyType**").

Especificar referências

SimpleTypeSpec & representa um ponteiro gerenciado ou referência. Por exemplo, para obter uma referência ao tipo MyType, use Type.GetType("MyType &"). Ao contrário dos ponteiros, as referências são limitadas a um nível.

Especificar matrizes

Na gramática BNF, ReflectionEmitDimension só se aplica a definições de tipo incompletas recuperadas usando ModuleBuilder.GetType. Definições de tipo incompletas são objetos TypeBuilder que são construídos usando System.Reflection.Emit, mas em que TypeBuilder.CreateType não foi chamado. ReflectionDimension pode ser usado para recuperar qualquer definição de tipo que tenha sido concluída, ou seja, um tipo que tenha sido carregado.

As matrizes são acessadas em reflexão, especificando a classificação da matriz:

  • Type.GetType("MyArray[]") Obtém uma matriz de dimensão única com limite inferior 0.
  • Type.GetType("MyArray[*]") Obtém uma matriz de dimensão única com limite inferior desconhecido.
  • Type.GetType("MyArray[][]") Obtém uma matriz bidimensional.
  • Type.GetType("MyArray[*,*]") e Type.GetType("MyArray[,]") obtém uma matriz bidimensional retangular com limites inferiores desconhecidos.

Do ponto de vista do tempo de execução, MyArray[] != MyArray[*]mas para matrizes multidimensionais, as duas notações são equivalentes. Ou seja, Type.GetType("MyArray [,]") == Type.GetType("MyArray[*,*]") avalia como verdade.

Para ModuleBuilder.GetType, MyArray[0..5] indica uma matriz de dimensão única com tamanho 6, limite inferior 0. MyArray[4…] indica uma matriz unidimensional de tamanho desconhecido e limite inferior 4.

Ver também