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.
- #919 - Gestione degli eventi in un Composite Control per ASP.NET 2.0
- Speciale .NET Framework 3.5 SP1
- Velocity: ADO.NET Distributed Cache
- #921 - Specificare un tipo custom come valore di un parametro di selezione dell'ObjectDataSource
- Disponibile parte del codice sorgente del Framework
- Chi ha paura di ASP.NET MVC?
- #935 - Sfruttare l'evento LoadComplete della pagina
- #947 - La direttiva OutputCache con ASP.NET 2.0 e 3.5
- un Provider Custom per l'health monitoring
- #956 - Aggiungere controlli ad una pagina ASP.NET con supporto per gli eventi usando XSLT
- ASP.NET 3.5 Extensions: MVC, history e Dynamic Data Controls
- Il mio progetto di migrazione ad ASP.NET 3.5: ASPItalia.com e WinFXItalia.com
Esprimi il tuo giudizio su questo script:
Per procedere devi essere autenticato.
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.








Stampa
Snippet
Download


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!