Home Page Home Page Tips & Tricks Recuperare i campi di una classe utilizzando la Reflection

Recuperare i campi di una classe utilizzando la Reflection


Per utilizzare al meglio tutte le potenzialità del framework e dell’ambiente .NET si deve per forza utilizzare una programmazione orientata agli oggetti, la cosiddetta OOP (Object Oriented Programming), riutilizzando al massimo il codice e ottimizzarlo il più possibile cercando di parametrizzare il codice dove è possibile.

In questo tip vedremo come ottenere i campi (fields) di una classe recuperando così ogni dettaglio(nome, valore, tipo).

Per fare tutto questo ci appoggiamo al namespace System.Reflection che al suo interno è composto di molteplici classi che consentono di recuperare i metadati degli Assemblies, di lavorare sulle classi ecc.
Prendiamo come esempio una semplice classe che chiameremo Utente:

VB.NET
Codice .NET n°1
Public Class Utente
Private Cognome As String
Private Nome As String
Private Shared DataDiNascita as DateTime
Private Indirizzo as String
Public Taglia as Integer


C#
Codice .NET n°2
public class Utente
{
private string Cognome;
private string Nome;
private static DateTime DataDiNascita;
private string Indirizzo;
public int Taglia;
}


Abbiamo diverse tipologie di campo (String, Integer, Data) e anche diversi accessi (public, private, stastic/shared).

Ora vedremo come recuperare questi campi.
Per recuperare i campi di una classe dobbiamo utilizzare la classe FieldInfo del namespace System.Reflection, questa classe non può essere istanziata perché non dispone di un costruttore pubblico quindi vediamo come utilizzarla.

VB.NET
Codice .NET n°3
Public Shared Function GetFields(ByVal val As Object) As FieldInfo()
Dim fi() As FieldInfo
Dim ty As Type = val.GetType
fi = ty.GetFields(BindingFlags.NonPublic Or _ BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.Static)
Return fi
End Function


C#
Codice .NET n°4
public static FieldInfo[] GetFields(object val)
{
FieldInfo[] fi;
Type ty = val.GetType();
fi = ty.GetFields(BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static );
return fi;
}


Analizziamo il codice appena inserito:
Abbiamo creato una funzione statica proprio perchè possa essere utilizzata all’esterno senza istanziare la classe.
Come valore di input abbiamo inserito un valore di tipo object per il riutilizzo del codice come detto in precedenza e come valore restituito dalla funzione un'array di FieldInfo.

Come prima cosa dichiariamo un nostro array di FieldInfo che poi sarà il risultato della nostra funzione.
Poi dichiariamo un oggetto Type perché come detto in precedenza la classe fieldInfo non può essere istanziata e quindi per recuperare gli oggetti dobbiamo utilizzare i metodi GetField o GetFields della classe System.Type.

Recuperiamo il "Type" del nostro valore di input in questo modo:

Type ty=val.GetType();

Una volta fatto questo riempiamo il nostro array di FieldInfo attraverso il metodo GetFields.
Quando si utilizza questo metodo bisogna specificargli i filtri di ricerca (BindingFlags) opportuni, quindi campi pubblici, privati, statici ecc.

Una volta recuperati i campi possiamo recuperare diverse proprietà, vediamo come:
Facciamo un ciclo foreach per recuperare ogni singolo campo:

VB.NET
Codice .NET n°5
Dim field As FieldInfo
For Each field In fi

Next



C#
Codice .NET n°6
foreach(FieldInfo field in fi)
{

}


Quindi adesso field è il nostro campo e possiamo recuperare tutte le informazioni:

• field.name il nome del campo
• field.GetValue(val) il valore del campo
• field.FieldType il tipo di valore(String,integer ecc.)
• field.IsPublic se è pubblico
• field.isPrivate se è privato
• field.IsStatic se è statico

Conclusioni


In questo tip abbiamo visto come con poche righe di codice è possibile recuperare, tramite i metadati, i campi di una classe, ma l’approccio per recuperare altre informazioni quali proprietà, metodi ecc. di una classe è lo stesso, basta usare invece che GetFields, gli altri metodi GetMethods o GetProperties.
Questo Tip è quindi una buona base di partenza per conoscere le potenzialità della Reflection.
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5