Reflection in .NET

Le classi nello spazio dei System.Reflection nomi, insieme System.Typea , consentono di ottenere informazioni sugli assembly caricati e sui tipi definiti all'interno di essi, ad esempio classi, interfacce e tipi valore , ovvero strutture ed enumerazioni. È anche possibile usare la reflection per creare istanze di tipi in fase di esecuzione, richiamarle e accedervi.

Gli assembly contengono moduli, i quali contengono tipi, che a loro volta contengono membri. La reflection fornisce oggetti che incapsulano assembly, moduli e tipi. È possibile usare la reflection per creare in modo dinamico un'istanza di un tipo, associare il tipo a un oggetto esistente od ottenere il tipo da un oggetto esistente. È quindi possibile richiamare i metodi del tipo o accedere ai relativi campi e proprietà. Gli impieghi tipici della reflection includono:

  • L'uso di Assembly per definire e caricare gli assembly, per caricare i moduli elencati nel manifesto dell'assembly e per individuare un tipo di tale assembly e crearne un'istanza.
  • L'uso di Module per individuare informazioni riguardanti ad esempio l'assembly che contiene il modulo e le classi incluse nel modulo. È anche possibile ottenere tutti i metodi globali o altri metodi specifici non globali definiti nel modulo.
  • L'uso di ConstructorInfo per individuare informazioni quali il nome, i parametri, i modificatori di accesso (ad esempio public o private) e i dettagli di implementazione (ad esempio abstract o virtual) di un costruttore. L'uso del metodo GetConstructors o GetConstructor di un oggetto Type per richiamare un costruttore specifico.
  • Usare MethodInfo per individuare informazioni quali il nome, il tipo restituito, i parametri, i modificatori di accesso e i dettagli di implementazione (ad esempio abstract o virtual) di un metodo. L'uso del metodo GetMethods o GetMethod di un oggetto Type per richiamare un metodo specifico.
  • Usare FieldInfo per individuare informazioni quali il nome, i modificatori di accesso e i dettagli di implementazione (ad esempio static) di un campo e per ottenere o impostare i valori dei campi.
  • L'uso di EventInfo per individuare informazioni quali nome, tipo di dati del gestore eventi, attributi personalizzati, tipo dichiarante e tipo riflesso di un evento, nonché per aggiungere o rimuovere i gestori eventi.
  • L'uso di PropertyInfo per ottenere informazioni quali nome, tipo di dati, tipo dichiarante, tipo riflesso e stato modificabile o di sola lettura di una proprietà nonché per ottenere o impostare i valori della proprietà.
  • L'uso di ParameterInfo per ottenere informazioni quali nome di un parametro, tipo di dati, tipo di parametro (se di input o di output) e posizione del parametro in una firma di un metodo.
  • Usare CustomAttributeData per individuare informazioni sugli attributi personalizzati quando si lavora nel MetadataLoadContext contesto di sola reflection o (.NET Framework). CustomAttributeData consente di esaminare gli attributi senza crearne istanze.

Le classi dello spazio dei nomi System.Reflection.Emit forniscono un tipo specializzato di reflection che consente di compilare tipi in fase di esecuzione.

La reflection può essere usata anche per creare browser di tipi, che consentono agli utenti di selezionare i tipi e quindi visualizzare le informazioni su tali tipi.

Esistono anche altri impieghi per la reflection. I compilatori di linguaggi come JScript usano la reflection per creare tabelle di simboli. Le classi dello spazio dei nomi System.Runtime.Serialization usano la reflection per accedere ai dati e determinare quali campi rendere persistenti. Le classi dello spazio dei nomi System.Runtime.Remoting usano la reflection in modo indiretto attraverso la serializzazione.

Tipi di runtime in reflection

La reflection fornisce classi, ad esempio Type e MethodInfo, per rappresentare tipi, membri, parametri e altre entità di codice. Tuttavia, quando si usa la reflection non si opera direttamente su queste classi, la maggior parte delle quali è astratta (MustInherit in Visual Basic). Si opera invece con tipi fornito da Common Language Runtime (CLR).

Ad esempio, quando si usa l'operatore typeof di C# (GetType in Visual Basic) per ottenere un oggetto Type, l'oggetto è in realtà un RuntimeType. RuntimeType deriva da Type e fornisce le implementazioni di tutti i metodi astratti.

Queste classi runtime sono internal (Friend in Visual Basic). Non sono documentate separatamente rispetto alle relative classi base, poiché il loro comportamento è descritto nella documentazione della classe base.

Riferimento