Reflection

Le classi nello spazio dei nomi System.Reflection, insieme a System.Type, consentono di ottenere informazioni sugli assembly caricati e sui tipi in essi definiti, ad esempio classi, interfacce e tipi di valore. È anche possibile utilizzare la reflection per creare istanze di tipi in fase di esecuzione, richiamarle e accedervi. Per argomenti su aspetti specifici della reflection, vedere Argomenti correlati al termine di questa panoramica.

Il caricatore di Common Language Runtime gestisce i domini applicazione, che costituiscono limiti definiti intorno a oggetti con lo stesso ambito di applicazione. La gestione include il caricamento di ciascun assembly nel dominio applicazione appropriato e il controllo della disposizione in memoria della gerarchia dei tipi di ciascun assembly.

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

  • L'utilizzo 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'utilizzo 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'utilizzo 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'utilizzo del metodo GetConstructors o GetConstructor di un oggetto Type per richiamare un costruttore specifico.

  • L'utilizzo di MethodInfo per individuare informazioni quali il nome, il tipo restituito, i parametri, i modificatori di accesso (ad esempio public o private) e i dettagli di implementazione (ad esempio abstract o virtual) di un metodo. L'utilizzo del metodo GetMethods o GetMethod di un oggetto Type per richiamare un metodo specifico.

  • L'utilizzo di FieldInfo per individuare informazioni quali il nome, i modificatori di accesso (ad esempio public o private) e i dettagli di implementazione (ad esempio static) di un campo, nonché per ottenere o impostare i valori dei campi.

  • L'utilizzo 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'utilizzo 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'utilizzo 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.

  • L'utilizzo di CustomAttributeData per individuare informazioni sugli attributi personalizzati in caso di utilizzo del contesto ReflectionOnly di un dominio applicazione. 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 utilizzata anche per creare applicazioni definite visualizzatori di tipi, che consentono agli utenti di selezionare i tipi e visualizzarne quindi le relative informazioni.

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

Argomenti correlati

Titolo

Descrizione

Tipi di runtime nella reflection

Vengono descritti i tipi interni, ad esempio RuntimeType, che ereditano le classi astratte nello spazio dei nomi System.Reflection e ne forniscono gran parte dell'implementazione.

Visualizzazione delle informazioni sul tipo

Viene illustrata la classe Type e vengono forniti esempi di codice in cui viene descritto come utilizzare Type con diverse classi di reflection per ottenere informazioni su costruttori, metodi, campi, proprietà ed eventi.

Reflection e tipi generici

Viene illustrata la modalità con cui la reflection gestisce i parametri e gli argomenti di tipo di metodi e tipi generici.

Modelli di progettazione utilizzati dalle classi di reflection

Viene fornita una tabella in cui si illustra il modello di denominazione dei metodi e l'utilizzo delle classi di reflection più comuni, quali ad esempio Module, Type e MemberInfo.

Considerazioni sulla sicurezza in relazione alla reflection

Vengono illustrate le regole che determinano in che misura è possibile utilizzare la reflection per recuperare informazioni sui tipi e accedere ai tipi.

Caricamento e utilizzo dinamico dei tipi

Viene illustrata l'interfaccia di associazione personalizzata della reflection che supporta l'associazione tardiva.

Procedura: caricare assembly nel contesto Reflection-Only

Viene descritto il contesto di caricamento Reflection-Only. Viene illustrato come caricare un assembly, verificare il contesto ed esaminare gli attributi applicati a un assembly nel contesto Reflection-Only.

Accesso ai membri predefiniti

Viene illustrato come utilizzare la reflection per accedere ai membri predefiniti di una classe.

Accesso ai valori predefiniti degli argomenti

Viene illustrato come utilizzare la reflection per accedere agli argomenti che dispongono di valori predefiniti e come richiamare i metodi che presentano argomenti con valori predefiniti.

Accesso ad attributi personalizzati

Viene illustrato l'utilizzo della reflection per ottenere informazioni sull'esistenza degli attributi e sui relativi valori.

Specifica di nomi di tipo completi

Vengono illustrati il formato dei nomi di tipo completi, secondo i canoni BNF (Backus-Naur Form), e la sintassi richiesta per specificare nomi di assembly, puntatori, riferimenti, matrici e caratteri speciali.

API Reflection non gestita

Viene indicato dove si trovano le informazioni sull'utilizzo della reflection non gestita per l'esame dei metadati.

Procedura: associare un delegato tramite reflection

Viene illustrato come creare un delegato per un metodo e associarlo a un evento. Viene illustrato come creare un metodo di gestione degli eventi in fase di esecuzione utilizzando DynamicMethod.

Creazione di assembly e metodi dinamici

Viene illustrato come generare assembly e metodi generici.

Riferimenti

System.Type

System.Reflection

System.Reflection.Emit

Torna all'inizio