di: Sosan Abou Assalè 07 Marzo 2007
Per provare il funzionamento del codice creiamo una pagina .aspx (default.aspx) che contiene un pulsante (Button1). Al click sul pulsante eseguiamo la procedura Test(), che stamperà a video il nome della classe, le tre proprietà e il metodo.
Listato 2. La procedura Test() nel dettaglio (versione VB.NET)
private void Test()
{
try {
string pathAsm = Server.MapPath("bin/autonoleggio.dll");
Assembly extAssembly = Assembly.LoadFrom(pathAsm);
Type[] types = extAssembly.GetTypes();
foreach(Type t in types)
{
Response.Write("<strong>Nome</strong><br />");
Response.Write(t.FullName + "<br />");
Response.Write("<strong>Proprietà</strong><br />");
GetProperties(t);
Response.Write("<strong>Metodi</strong><br />");
GetMethods(t);
}
} catch(Exception e) {
Response.Write(e.Message);
}
}
Nella procedura Test(), dopo aver caricato la nostra classe assembly in memoria ed aver recuperato un'istanza della stessa classe Assembly elenchiamo in un ciclo il nome, le proprietà ed i metodi, utilizzando i metodi GetProperties e GetMethods.
Listato 3. Il metodo GetProperties (versione VB.NET)
public void GetProperties(Type theType)
{
// Prende le proprietà dell'oggetto
PropertyInfo[] myProperties = theType.GetProperties((BindingFlags.Public | BindingFlags.Instance));
// Loop che esamina le proprietà
foreach(PropertyInfo item in myProperties)
{
if(theType.IsPublic)
{
Response.Write(item.Name + " è di tipo " + item.PropertyType.ToString() + " e ");
// determina se la proprietà può essere letta
if(item.CanRead)
Response.Write(" può essere letta e ");
else
Response.Write("non può essere letta e ");
// determina se la proprietà può essere scritta
if(item.CanWrite)
Response.Write(" può essere scritta.");
else
Response.Write(" non può essere scritta.");
}
Response.Write("<br />");
}
}
Listato 4. Il metodo GetMethods (versione VB.NET)
public void GetMethods(Type theType)
{
//Legge i metodi dell'oggetto
MethodInfo[] myMethods = theType.GetMethods();
foreach (MethodInfo item in myMethods)
{
if (theType.IsPublic)
{
Response.Write(item.Name + " restituisce " + item.ReturnType.ToString() + "<br />");
// determina se il metodo è pubblico o privato
if(item.IsPrivate)
Response.Write(" è privato e non può essere eseguito " + "<br />");
if (item.IsConstructor)
Response.Write(" ed è il costruttore per " + theType.Name + "<br />");
Response.Write("<br />");
}
}
}
Una volta lanciato il test e cliccato sul pulsante apparirà la nostra pagina web con la descrizione dettagliata della classe.
Figura 1. Le informazioni della classe
In questo articolo abbiamo introdotto il concetto di Reflection illustrando attraverso un esempio pratico come sia possibile recuperare le informazioni a runtime di una classe.
Questo contributo vuole essere una base di partenza per conoscere le potenzialità della Reflection. I lettori più attenti avranno anche notato come una persona esperta potrebbe ricostruire il codice sorgente (o frammenti di codice per poterlo ricostruire) a partire dall'eseguibile. La Reflection presenta importanti potenzialità, pertanto ogni sviluppatore dovrebbe conoscerne le caratteristiche e sapere in quali circostanze applicarlo per es. per la creazione di ispezionatori di classi, di debuggers o più in generale per la creazione di applicazioni a componenti.
Guida Windows Azure Code SnippetsLe migliori pratiche per far girare le applicazioni "in the cloud",... |
Guida ASP.NET MVC Best PracticesUn workflow dettagliato e ricco di suggerimenti pratici per... |
Guida ASP.NET Starter KitUn modo semplice per imparare ad utilizzare le tecnologie Microsoft... |
Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.
Iscriviti alla newsletter
|
|
Corso Progettazione database11 Maggio 2012 a Milano |
|
|
Amministratore di Reti Windows Server 200811 Giugno 2012 a Milano |
|
Nessun corso previsto |