Specificare nomi di tipi completi

È necessario specificare nomi di tipi per avere input validi per le diverse operazioni di reflection. Un nome completo consiste in una specifica del nome di assembly, in una specifica dello spazio dei nomi e in un nome di tipo. Le specifiche dei nomi di tipi vengono usate dai metodi, quali Type.GetType, Module.GetType, ModuleBuilder.GetType e Assembly.GetType.

Grammatica per i nomi dei tipi

La grammatica definisce la sintassi di linguaggi formali. La tabella seguente elenca le regole lessicali che descrivono come riconoscere un input valido. I terminali (ovvero gli elementi che non sono ulteriormente riducibili) vengono visualizzati in lettere maiuscole. I non terminali (ovvero gli elementi che sono ulteriormente riducibili) vengono visualizzati in stringhe miste di maiuscole e minuscole o in stringhe tra virgolette singole, ma la virgoletta singola (') non è parte della sintassi stessa. Il carattere barra verticale (|) indica le regole con subrules.

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
	;

Specificare caratteri speciali

In un nome di tipo, IDENTIFIER corrisponde a un qualsiasi nome valido determinato dalle regole di un linguaggio.

Usare la barra rovesciata (\) come carattere di escape per separare i token seguenti quando vengono usati come parte di IDENTIFIER.

Token Significato
\, Separatore di assembly.
\+ Separatore di tipo annidato.
\& Tipo di riferimento.
\* Tipo di puntatore.
\[ Delimitatore delle dimensioni della matrice.
\] Delimitatore delle dimensioni della matrice.
\. Usare la barra rovesciata prima di un punto solo se il punto è usato in una specifica di matrice. I punti in NamespaceSpec non accettano la barra rovesciata.
\\ Barra rovesciata se necessaria come stringa letterale.

In tutti i componenti TypeSpec, ad eccezione di AssemblyNameSpec, gli spazi sono rilevanti. In AssemblyNameSpec, gli spazi che precedono il separatore ',' sono rilevanti, ma gli spazi dopo il separatore ',' vengono ignorati.

Le classi reflection, ad esempio Type.FullName, restituiscono il nome modificato in modo che possa essere usato in una chiamata a GetType, ad esempio in MyType.GetType(myType.FullName).

Ad esempio, il nome completo per un tipo potrebbe essere Ozzy.OutBack.Kangaroo+Wallaby,MyAssembly.

Se lo spazio dei nomi fosse Ozzy.Out+Back, il segno di addizione dovrebbe essere preceduto da una barra rovesciata. In caso contrario, il parser lo interpreterebbe come separatore di annidamento. Reflection genera questa stringa come Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly.

Specificare i nomi degli assembly

Le informazioni minime necessarie in una specifica di nome di assembly è il nome testuale (IDENTIFIER) dell'assembly. È possibile far seguire l'IDENTIFIER da un elenco delimitato da virgole di coppie proprietà/valore, come descritto nella tabella seguente. La denominazione dell'IDENTIFIER deve seguire le regole di denominazione dei file. La denominazione dell'IDENTIFIER non fa distinzione tra maiuscole e minuscole.

Nome proprietà Descrizione Valori consentiti
Versione Numero di versione dell'assembly Major.Minor.Build.Revision, dove Major, Minor, Build e Revision sono numeri interi compresi tra 0 e 65535.
PublicKey Chiave pubblica completa Valore di stringa della chiave pubblica completa in formato esadecimale. Specificare un riferimento Null (Nothing in Visual Basic) per indicare in modo esplicito un assembly privato.
PublicKeyToken Token di chiave pubblica (hash a 8 byte della chiave pubblica completa) Valore di stringa del token della chiave pubblica in formato esadecimale. Specificare un riferimento Null (Nothing in Visual Basic) per indicare in modo esplicito un assembly privato.
Impostazioni cultura Impostazioni cultura dell'assembly Impostazioni cultura dell'assembly in formato RFC 1766 o "neutral" per gli assembly indipendenti dal linguaggio (non satellite).
Personalizzazione BLOB (Binary Large Object, Oggetto binario di grandi dimensioni) personalizzato. Attualmente viene usato solo in assembly generati dal generatore di immagini native (Ngen). Stringa personalizzata usata dal generatore di immagini native per notificare alla cache di assembly che l'assembly che si sta installando è un'immagine nativa e deve pertanto essere installato nella cache delle immagini native. Nota anche come stringa zap.

L'esempio seguente illustra un AssemblyName per un assembly a nome semplice con le impostazioni cultura predefinite.

com.microsoft.crypto, Culture=""

L'esempio seguente illustra un riferimento completo per un assembly con nome sicuro nelle impostazioni cultura "en" (inglese).

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

Gli esempi seguenti illustrano un AssemblyName parzialmente specificato, che può essere soddisfatto da un assembly con nome sicuro o semplice.

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

Gli esempi seguenti illustrano un AssemblyName parzialmente specificato, che deve essere soddisfatto da un assembly con nome semplice.

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

Gli esempi seguenti illustrano un AssemblyName parzialmente specificato, che deve essere soddisfatto da un assembly con nome sicuro.

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

Specificare i tipi generici

SimpleTypeSpec'NUMBER rappresenta un tipo generico aperto con da 1 a n parametri di tipo generico. Ad esempio, per ottenere un riferimento al tipo List<T> generico aperto o al tipo List<String>generico chiuso, usare Type.GetType("System.Collections.Generic.List`1") Per ottenere un riferimento al tipo Dictionary<TKey,TValue>generico , usare Type.GetType("System.Collections.Generic.Dictionary`2").

Specificare i puntatori

SimpleTypeSpec* rappresenta un puntatore non gestito. Ad esempio, per ottenere un puntatore per il tipo MyType, usare Type.GetType("MyType*"). Per ottenere un puntatore a un puntatore per il tipo MyType, usare Type.GetType("MyType**").

Specificare i riferimenti

SimpleTypeSpec & rappresenta un riferimento o puntatore gestito. Ad esempio, per ottenere un riferimento per il tipo MyType, usare Type.GetType("MyType &"). A differenza dei puntatori, i riferimenti sono limitati a un livello.

Specificare matrici

Nella grammatica BNF, ReflectionEmitDimension si applica solo a definizioni di tipi incomplete recuperate tramite ModuleBuilder.GetType. Le definizioni di tipi incomplete sono oggetti TypeBuilder costruiti tramite System.Reflection.Emit senza chiamare TypeBuilder.CreateType. ReflectionDimension può essere usato per recuperare qualsiasi definizione di tipo che è stata completata, vale a dire, un tipo che è stato caricato.

Le matrici sono accessibili in reflection specificando l'ordine della matrice:

  • Type.GetType("MyArray[]") ottiene una matrice unidimensionale con un limite inferiore pari a 0.
  • Type.GetType("MyArray[*]") ottiene una matrice unidimensionale con un limite inferiore sconosciuto.
  • Type.GetType("MyArray[][]") ottiene una matrice di matrice bidimensionale.
  • Type.GetType("MyArray[*,*]") e Type.GetType("MyArray[,]") ottengono una matrice rettangolare bidimensionale con limiti inferiori sconosciuti.

Dal punto di vista di runtime, MyArray[] != MyArray[*], ma per le matrici multidimensionali, le due notazioni sono equivalenti. Vale a dire, Type.GetType("MyArray [,]") == Type.GetType("MyArray[*,*]") restituisce true.

Per ModuleBuilder.GetTypeindica MyArray[0..5] una matrice a dimensione singola con dimensione 6, limite inferiore 0. MyArray[4…] indica una matrice unidimensionale di dimensioni sconosciute e limite inferiore pari a 4.

Vedi anche