Specifica di nomi di tipo completi

Per ottenere un input valido per diverse operazioni di reflection, è necessario specificare i nomi dei tipi. Un nome di tipo completo è costituito dalla specifica di un nome di assembly, dalla specifica di uno spazio dei nomi e da un nome di tipo. Le specifiche dei nomi di tipi vengono utilizzate da metodi come Type.GetType, Module.GetType, ModuleBuilder.GetType e Assembly.GetType.

Grammatica Backus-Naur Form per nomi di tipi

La Backus-Naur Form (BNF) definisce la sintassi di linguaggi formali. Nella tabella che segue sono elencate le regole lessicali BNF che consentono di riconoscere un input valido. I terminal (elementi non ulteriormente riducibili) sono riportati in maiuscolo. I non terminal (elementi ulteriormente riducibili) sono riportati come combinazione di lettere maiuscole e minuscole o in stringhe racchiuse tra virgolette. In quest'ultimo caso le virgolette (") non fanno parte della sintassi. Il carattere barra verticale (|) denota regole che presentano sottoregole.

Grammatica BNF per i nomi di tipo completi

TypeSpec                          :=   ReferenceTypeSpec

                                        |     SimpleTypeSpec

ReferenceTypeSpec            :=   SimpleTypeSpec '&'

SimpleTypeSpec                :=   PointerTypeSpec

                                        |     ArrayTypeSpec

                                        |     TypeName

PointerTypeSpec                :=   SimpleTypeSpec '*'

ArrayTypeSpec                  :=   SimpleTypeSpec '[ReflectionDimension]'

                                        |     SimpleTypeSpec '[ReflectionEmitDimension]'

ReflectionDimension           :=   '*'

                                        |     ReflectionDimension ',' ReflectionDimension

                                        |     NOTOKEN

ReflectionEmitDimension    :=   '*'

                                        |     Number '..' Numero

                                        |     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

Specifica di caratteri speciali

In TypeName IDENTIFIER rappresenta qualsiasi nome valido stabilito in base alle regole di un linguaggio.

Utilizzare la barra rovesciata (\) come carattere di escape per separare i seguenti token, quando vengono utilizzati in 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

\.

Utilizzare la barra rovesciata prima di un punto solo se questo viene utilizzato in una specifica di matrice. In NamespaceSpec non è previsto l'uso di barre rovesciate prima dei punti.

\\

Utilizzare la barra rovesciata quando richiesta come stringa letterale.

Tenere presente che gli spazi sono rilevanti in tutti i componenti TypeSpec ad eccezione di AssemblyNameSpec. In AssemblyNameSpec gli spazi che precedono il separatore "," sono rilevanti, mentre quelli che lo seguono vengono ignorati.

Le classi Reflection, quali Type.FullName, restituiscono il nome alternativo in modo che possa essere utilizzato in una chiamata a GetType, ad esempio in MyType.GetType(myType.FullName).

Il nome completo di un tipo è ad esempio Ozzy.OutBack.Kangaroo+Wallaby,MyAssembly.

Se lo spazio dei nomi fosse Ozzy.Out+Back, il segno più (+) dovrebbe essere preceduto da una barra rovesciata. In caso contrario, verrebbe interpretato dal parser come operatore di nidificazione. Con Reflection la stringa viene riprodotta come Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly.

Specifica dei nomi degli assembly

Le informazioni minime richieste per la specifica del nome di un assembly sono rappresentate dal nome testuale (IDENTIFIER) dell'assembly. Dopo l'IDENTIFIER è possibile aggiungere un elenco di coppie di valori/proprietà separate da virgole, come descritto nella tabella che segue. Per l'assegnazione del nome dell'IDENTIFIER attenersi alle regole per l'assegnazione dei nomi di file. IDENTIFIER non prevede distinzioni tra maiuscole e minuscole.

Nome della proprietà

Descrizione

Valori ammessi

Versione

Numero di versione dell'assembly

Major.Minor.Build.Revision, dove Major, Minor, Build e Revision sono valori interi compresi tra 0 e 65535.

PublicKey

Chiave pubblica completa

Valore string della chiave pubblica completa in formato esadecimale. Specificare un riferimento null (Nothing in Visual Basic) per indicare un assembly privato in modo esplicito.

PublicKeyToken

Token di chiave pubblica (hash a 8 byte della chiave pubblica completa)

Valore string del token della chiave pubblica in formato esadecimale. Specificare un riferimento null (Nothing in Visual Basic) per indicare un assembly privato in modo esplicito.

Culture

Impostazioni cultura dell'assembly

Impostazioni cultura dell'assembly in formato RFC-1766, o "neutral" per assembly non dipendenti dalla lingua (non satellite).

Personalizzato

Oggetto binario di grandi dimensioni personalizzato (BLOB). Utilizzato attualmente solo in assembly generati dal Generatore di immagini native (Ngen).

Stringa personalizzata utilizzata dallo strumento generatore di immagini native per notificare alla cache dell'assembly che l'assembly da installare è un'immagine nativa e pertanto deve essere installato nella cache delle immagini native. Definita anche come stringa zap.

Nell'esempio riportato di seguito viene illustrato AssemblyName per un assembly con nome semplice e impostazioni cultura predefinite.

com.microsoft.crypto, Culture="" 

Nell'esempio riportato di seguito viene illustrato un riferimento completamente specificato per un assembly con nome sicuro e impostazioni cultura "en".

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

Di seguito sono riportati esempi di AssemblyName parzialmente specificati che possono essere soddisfatti da un assembly con nome semplice o con nome sicuro.

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

Di seguito sono riportati esempi di AssemblyName parzialmente specificati che devono essere soddisfatti da un assembly con nome semplice.

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

Di seguito sono riportati esempi di AssemblyName parzialmente specificati che devono essere soddisfatti da un assembly con nome sicuro.

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

Specifica dei puntatori

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

Specifica dei riferimenti

SimpleTypeSpec & rappresenta un riferimento o puntatore gestito. Per ottenere ad esempio un riferimento per il tipo MyType, utilizzare Type.GetType("MyType &"). Tenere presente che, a differenza dei puntatori, i riferimenti sono limitati a un solo livello.

Specifica delle matrici

Nella grammatica BNF, ReflectionEmitDimension è valido solo per definizioni di tipo incomplete recuperate tramite ModuleBuilder.GetType. Per definizioni di tipo incomplete si intendono oggetti TypeBuilder costruiti utilizzando Reflection.Emit ma sui quali non è stato chiamato TypeBuilder.CreateType. È possibile utilizzare ReflectionDimension per recuperare qualsiasi definizione di tipo completata, ovvero un tipo caricato.

Per accedere alle matrici tramite reflection, è necessario specificare il numero di dimensioni della matrice.

  • Type.GetType("MyArray[]") ottiene una matrice unidimensionale con limite inferiore pari a 0.

  • Type.GetType("MyArray[*]") ottiene una matrice unidimensionale con limite inferiore sconosciuto.

  • Type.GetType("MyArray[][]") ottiene una matrice di una matrice bidimensionale.

  • Type.GetType("MyArray[*,*]") e Type.GetType("MyArray[,]") ottiene una matrice rettangolare bidimensionale con limiti inferiori sconosciuti.

Dal punto di vista del runtime le due notazioni MyArray[] != MyArray[*] sono equivalenti ma per matrici multidimensionali. Type.GetType("MyArray [,]") == Type.GetType("MyArray[*,*]") viene pertanto valutata come true.

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

Vedere anche

Riferimenti

AssemblyName

ModuleBuilder

TypeBuilder

Type.FullName

Type.GetType

Type.AssemblyQualifiedName

Concetti

Visualizzazione delle informazioni sul tipo