Può capitare di dover ottenere una variabile o richiamare metodi di una classe che hanno un accesso protected o internal. Per esempio la classe HttpRequest ha una proprietà LocalAddress che restituisce l'IP della macchina, ma è internal. Per aggirare il problema possiamo far uso della reflection. Una volta ottenuto un riferimento al Type possiamo accedere a tutti i metadati e a qualsiasi membro, ottenere informazioni su di essi e prelevare o impostare, data l'istanza dell'oggetto, il valore di un field o richiamare un suo metodo (quindi anche le proprietà o eventi). Le classi necessarie per far ciò sono contenute nel namespace System.Reflection.
Nel caso indicato prima potremmo fare:
Type t = Request.GetType(); PropertyInfo pi = t.GetProperty("LocalAddress", BindingFlags.NonPublic | BindingFlags.Instance); object value = pi.GetValue(Request, null); Response.Write(value.ToString());
Il BindingFlags è necessario per indicare il range di membri nella quale deve cercare (quindi, più siamo preciso, meglio è). Il secondo paramentro di GetValue vuole un array di object, per le proprietà parametriche (in questo caso null, perché non ce ne sono).
Altro esempio: a volte è utile è sapere la pagina di Login specificata nella sezione authentication del web.config. La chiamata GetConfig restituisce un tipo AuthenticationConfig, per cui basta guardare con il reflector che membri ha:
object config = Context.GetConfig("system.web/authentication"); Type t2 = config.GetType(); PropertyInfo pi2 = t2.GetProperty("LoginUrl", BindingFlags.NonPublic | BindingFlags.Instance); object value2 = pi2.GetValue(config, null); Response.Write(value2.ToString());
L'unico limite dato da questa tecnica è che non possiamo accedere ai membri privati.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
I più letti di oggi
- Accedere con ASP.NET ad un documento XML creato dall'oggetto recordset di ADO e ASP
- Richiamare programmaticamente le operazioni di aggiornamento, eliminazione e inserimento di FormView, DetailsView e GridView
- Aumentare la scalabilità di ASP.NET Core Web API con caching client side
- Visualizzare contenuti Fullscreen con HTML5
- Disabilitare un bottone in una pagina HTML pensando all'accessibilità
- Realizzare siti sicuri con ASP.NET Web Pages
- Focus dei tag input con HTML5
- Disponibile la beta di Silverlight 5
- Ricavare lo spazio occupato su disco dal nostro sito