Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
È necessario specificare i nomi dei tipi affinché l'input sia valido per le diverse operazioni di reflection. Un nome di tipo completo è costituito da una specifica del nome dell'assembly, una specifica dello spazio dei nomi e un nome di tipo. Le specifiche del nome del tipo vengono usate da metodi come Type.GetType, Module.GetType, ModuleBuilder.GetTypee Assembly.GetType.
Grammatica per i nomi dei tipi
La grammatica definisce la sintassi dei linguaggi formali. Nella tabella seguente sono elencate le regole lessicali che descrivono come riconoscere un input valido. I terminali (gli elementi che non sono ulteriormente riducibili) vengono mostrati con tutte le lettere in maiuscolo. Gli non terminali (quegli elementi che sono ulteriormente reducibili) sono mostrati in maiuscolo e minuscolo o racchiusi tra virgolette singole, mentre la virgolette singola (') non fa parte della sintassi stessa. Il carattere pipe (|) indica le regole con sotto-regole.
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 è qualsiasi nome valido determinato dalle regole di una lingua.
Usare il backslash (\) come carattere di escape per separare i token seguenti quando vengono usati come parte di "IDENTIFIER".
Token di accesso | Significato |
---|---|
\, |
Separatore di assemblaggio. |
\+ |
Separatore del tipo annidato. |
\& |
Tipo di riferimento. |
\* |
Tipo di puntatore. |
\[ |
Delimitatore della dimensione dell'array. |
\] |
Delimitatore della dimensione dell'array. |
\. |
Usare la barra rovesciata prima di un punto solo se il punto viene usato in una specifica di matrice. I punti in NamespaceSpec non utilizzano la barra rovesciata. |
\\ |
Barra rovesciata quando necessario come valore letterale stringa. |
In tutti i componenti TypeSpec, ad eccezione di AssemblyNameSpec, gli spazi sono rilevanti. In AssemblyNameSpec gli spazi prima del separatore ',' sono rilevanti, ma gli spazi dopo il separatore ',' vengono ignorati.
Le classi di reflection, come Type.FullName, restituiscono il nome offuscato in modo che quest'ultimo possa essere utilizzato in una chiamata a GetType, come 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 era Ozzy.Out+Back
, il segno più deve essere preceduto da una barra rovesciata. In caso contrario, il parser lo interpreta come separatore di annidamento. La riflessione genera questa stringa come Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly
.
Specificare i nomi degli assembly
Le informazioni minime necessarie in una specificazione del nome dell'assembly sono il nome testuale (IDENTIFIER) dell'assembly. È possibile seguire l'identificatore in base a un elenco delimitato da virgole di coppie di proprietà/valore, come descritto nella tabella seguente. La denominazione dell'identificatore deve seguire le regole per la denominazione dei file. L'identificatore non fa distinzione tra maiuscole e minuscole.
Nome della 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 inclusi. |
PublicKey | Chiave pubblica completa | Valore 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 stringa del token di chiave pubblica in formato esadecimale. Specificare un riferimento Null (Nothing in Visual Basic) per indicare in modo esplicito un assembly privato. |
Cultura | Cultura dell'assemblaggio | Cultura dell'assembly in formato RFC-1766, o "neutral" per assembly indipendenti dal linguaggio (non satellite). |
Personalizzato | Oggetto binario di grandi dimensioni personalizzato (BLOB). Questa opzione viene attualmente usata solo negli assembly generati dal generatore di immagini native (Ngen). | Stringa personalizzata usata dallo strumento Generatore di immagini native per notificare alla cache di assembly che l'assembly installato è un'immagine nativa e pertanto deve essere installata nella cache delle immagini native. Chiamata anche "zap string". |
Nell'esempio seguente viene illustrato un AssemblyName per un assembly con nome semplice e cultura predefinita.
com.microsoft.crypto, Culture=""
Nell'esempio seguente viene illustrato un riferimento completamente specificato per un assembly fortemente nominato con cultura "en".
com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012,
Version=1.0.0.0
Negli esempi seguenti viene illustrato un AssemblyName parzialmente specificato, che può essere soddisfatto da un assembly sicuro o semplicemente denominato.
com.microsoft.crypto
com.microsoft.crypto, Culture=""
com.microsoft.crypto, Culture=en
Negli esempi seguenti, ciascuno mostra un AssemblyName parzialmente specificato, che deve essere soddisfatto da un assembly a nome semplice.
com.microsoft.crypto, Culture="", PublicKeyToken=null
com.microsoft.crypto, Culture=en, PublicKeyToken=null
Negli esempi seguenti viene illustrato 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")
.
Indicare i puntatori
SimpleTypeSpec* rappresenta un puntatore non gestito. Ad esempio, per ottenere un puntatore al tipo MyType, utilizzare Type.GetType("MyType*")
. Per ottenere un puntatore a un puntatore di tipo MyType, usare Type.GetType("MyType**")
.
Specificare i riferimenti
SimpleTypeSpec & rappresenta un puntatore o un riferimento gestito. Ad esempio, per ottenere un riferimento al 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 alle definizioni di tipi incomplete recuperate tramite ModuleBuilder.GetType. Le definizioni di tipo incomplete sono TypeBuilder oggetti costruiti usando System.Reflection.Emit ma su cui TypeBuilder.CreateType non è stato chiamato. ReflectionDimension può essere usato per recuperare qualsiasi definizione di tipo completata, ovvero un tipo caricato.
È possibile accedere alle matrici nella reflection specificando il rango della matrice:
-
Type.GetType("MyArray[]")
ottiene una matrice a dimensione singola con un limite inferiore di 0. -
Type.GetType("MyArray[*]")
ottiene una matrice a dimensione singola con limite inferiore sconosciuto. -
Type.GetType("MyArray[][]")
ottiene una matrice bidimensionale. -
Type.GetType("MyArray[*,*]")
eType.GetType("MyArray[,]")
ottiene una matrice bidimensionale rettangolare 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.GetType
indica MyArray[0..5]
una matrice a dimensione singola con dimensione 6, limite inferiore 0.
MyArray[4…]
indica una matrice a dimensione singola di dimensioni sconosciute e un limite inferiore 4.