FieldInfo.GetValue null retour d'un membre privé alors que débogueur indique un champ est non nul?
-
10-10-2019 - |
Question
Dans C # / .NET 4.0 Je suis en train de récupérer une valeur de champ par la réflexion avec:
var bar = foo.GetType()
.GetField("_myField", BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(foo)
Je suis un peu perplexe par la situation. La valeur renvoyée est null
, et encore, le champ (quand on l'observe à travers le débogueur) est non nulle. Encore plus déconcertant, le code ci-dessus pour les œuvres d'autres propriétés de l'objet.
Le seul aspect étrange sont les deux drapeaux IsSecurityCritical
et IsSecuritySafeCritical
qui sont true
, mais je ne suis même pas sûr qu'il est en fait adapté à la situation.
Je termine dans une telle situation avec une petite 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.
}
}
Toute suggestion qui pourrait expliquer un tel comportement?
La solution
Ceci est causé par le modèle de sécurité dans .net 4.0, que vous utilisez une application asp.net, qui est probablement pas en cours d'exécution en pleine confiance. Comme le domaine est la sécurité critique, vous ne pouvez pas y accéder par la réflexion.
Vous pouvez lire un peu sur le msdn sur: Considérations sur la sécurité pour la réflexion