FieldInfo.GetValue nullo cambio di un membro privato, mentre debugger indica campo non è nulla?
-
10-10-2019 - |
Domanda
In C # / .NET 4.0 Sto cercando di recuperare un valore di campo attraverso la riflessione con:
var bar = foo.GetType()
.GetField("_myField", BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(foo)
Sono un po 'perplesso dalla situazione. Il valore restituito è null
, e tuttavia, il campo (quando osservata attraverso il debugger) non è nullo. Ancora più sconcertante, il codice qui sopra funziona per le altre proprietà dell'oggetto.
L'unico aspetto strano sono le due bandiere IsSecurityCritical
e IsSecuritySafeCritical
che sono true
, ma non sono nemmeno sicuro che sia realmente rilevante per la situazione.
Io sono finire in tale situazione un con una piccola HttpModule.
public class MyModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += BeginRequest;
}
void BeginRequest(object sender, EventArgs e)
{
var app = (HttpApplication)sender;
var rawContent = typeof(HttpRequest)
.GetField("_rawContent", BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(app.Request);
// at this point 'rawContent' is null, while debugger indicates it is not.
}
}
Ogni suggerimento che spiegherebbe un tale comportamento?
Soluzione
Questo è causato dal modello di sicurezza in .NET 4.0, come si sta eseguendo un'applicazione asp.net, che probabilmente non è in esecuzione in piena fiducia. Come il campo è la sicurezza critica, non è possibile accedervi attraverso la riflessione.
Si può leggere un po 'su MSDN su: Considerazioni di sicurezza per la riflessione