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 mistas ou entre aspas individualmente, mas a aspa simples (') 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.
Token | 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 somente se o período for usado em uma especificação de matriz. Os períodos em NamespaceSpec não aceitam a barra invertida. |
\\ |
Barra invertida quando necessário como uma cadeia de caracteres 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 assembly
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.
Property name | Description | 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). |
Personalizadas | BLOB (objeto binário grande) personalizado. Atualmente, isso é usado apenas em assemblies gerados pelo Native Image Generator (Ngen). | Cadeia de caracteres personalizada usada pela ferramenta Native Image Generator para notificar o cache de assembly de que o assembly que está sendo instalado é uma imagem nativa e, portanto, deve ser instalado no cache de imagem nativa. Também chamada de string zap. |
O exemplo a seguir mostra um AssemblyName para um assembly simplesmente nomeado com cultura padrão.
com.microsoft.crypto, Culture=""
O exemplo a seguir mostra uma referência totalmente especificada para um assembly fortemente nomeado com 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 forte ou simplesmente nomeado.
com.microsoft.crypto
com.microsoft.crypto, Culture=""
com.microsoft.crypto, Culture=en
Cada um dos exemplos a seguir mostra um AssemblyName parcialmente especificado, que deve ser satisfeito por um assembly nomeado simplesmente.
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 deve ser satisfeito 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 para digitar 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 TypeBuilder objetos construídos usando System.Reflection.Emit , mas nos quais 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[*,*]")
eType.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.