Un'introduzione alla Reflection

di Riccardo Golia, in ASP.NET,

Reflection indica la possibilità di ottenere le informazioni relative ai tipi contenuti in un assembly a run-time. Infatti tramite il namespace System.Reflection il .NET Framework fornisce una serie di API per analizzare assemblies e oggetti, consentendo addirittura di invocare direttamente i metodi di una classe, o di accedere alle sue proprietà.

La Reflection si rivela pertanto un meccanismo assai potente e utile in molte circostanze, per esempio, per creare assemblies dinamicamente in memoria o, appunto, invocare un metodo di un tipo contenuto in un assembly.

Per utilizzare la Reflection la prima cosa da fare è includere il relativo namespace, che è System.Reflection :

[VB.NET]

Imports System.Reflection

[C#]

using System.Reflection;

Una volta importato il namespace, occorre caricare l'assembly da "analizzare". Nel nostro caso la DLL si chiamerà in modo molto fantasioso: myAssembly.dll . Per fare ciò si utilizza il metodo statico Assembly.LoadFrom(String) , che carica in memoria l'assembly il cui percorso viene passato come parametro alla funzione. Il metodo restituisce un'istanza della stessa classe Assembly.

[VB.NET]

Dim asm As Assembly = Assembly.LoadFrom("myAssembly.dll")

[C#]

Assembly asm = Assembly.LoadFrom("myAssembly.dll");

Per ottenere informazioni su myAssembly.dll ed, in particolar modo, sui tipi in esso contenuti si può utilizzare uno fra i due metodi Assembly.GetTypes() e Assembly.GetType(String) : il primo permette di ottenere un array di tipi, il secondo restituisce i dettagli del tipo il cui nome è specificato nel parametro.

[VB.NET]

Dim typeArray As Type() = asm.GetTypes()
Dim thisType As Type = asm.GetType("myClass")

[C#]

Type typesArray[] = asm.GetTypes();
 Type thisType = asm.GetType("myClass");

In realtà esistono diverse firme per il metodo GetType (overloading), ma lascio alla buona volontà di ciascuno eventuali approfondimenti in merito. Tramite Assembly.GetType(String) è possibile conoscere non poche informazioni su un tipo: Name , Namespace , IsClass , IsInterface , IsAbstract , IsCOMObject , IsSealed , IsPublic , ecc. Per la classe Type esistono alcuni metodi per ottenere i membri associati ad un tipo (campi, metodi e proprietà) come istanze di classi particolari contenute nel namespace System.Reflection :

  • GetMembers() : ritorna una array di oggetti System.Reflection.MemberInfo ;
  • GetFields() : ritorna una array di oggetti System.Reflection.FieldInfo ;
  • GetProperties() : ritorna una array di oggetti System.Reflection.PropertyInfo ;
  • GetMethods() : ritorna un array di oggetti System.Reflection.MethodInfo .

[VB.NET]

Dim methodsArray As MethodInfo = thisType.GetMethods()
Dim thisMethod As MethodInfo = thisType.GetMethod("myMethod")

[C#]

MethodInfo[] methodsArray = thisType.GetMethods();
MethodInfo thisMethod = thisType.GetMethod("myMethod");

Ciascuna delle classi sopra citate ( MemberInfo , FieldInfo , PropertyInfo e MethodInfo ) espone metodi e proprietà specifiche. In particolare, la classe System.Reflection.MethodInfo è caratterizzata tra gli altri dai seguenti membri:

  • Name ;
  • IsPrivate ;
  • IsPublic ;
  • IsStatic ;
  • IsVirtual ;
  • IsConstructor ;
  • ReturnType ;
  • GetParameters() ;
  • Invoke(Object, Object[]) .
2 pagine in totale: 1 2
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti