Richiamare metodi internal o protected con la reflection

di Cristian Civera, in UserScript, ASP.NET, System.Reflection,

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

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

Nessuna risorsa collegata

I più letti di oggi