En C#/.NET 4.0 Je suis en train de récupérer une valeur de champ par la réflexion avec:FieldInfo.GetValue retourne null pour un membre privé alors que le débogueur indique que le champ est non nul?
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 pourtant, le champ (lorsqu'il est observé via le débogueur) n'est pas nul. Encore plus curieux, le code ci-dessus fonctionne pour les autres propriétés de l'objet.
Le seul aspect impair sont les deux indicateurs IsSecurityCritical
et IsSecuritySafeCritical
qui sont true
, mais je ne suis même pas sûr que ce soit réellement pertinent à la situation. Je me retrouve dans une telle situation avec un petit 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.
}
}
Une suggestion qui pourrait expliquer un tel comportement?
Le débogueur frappe parfois les chemins de code que vous ne voyez attendez pas et ne pas dans des conditions normales (comme les méthodes toString(), des trucs de chargement paresseux, etc...). La seule façon de vérifier si votre code fonctionne bien ou non dans ces situations est de tester sans un débogage attaché. C'est le principe d'incertitude de Heisenberg appliqué à la programmation .NET :-) –
Le type de champ est-il Nullable? (IE: int ?, bool ?, etc) –
Le champ n'est pas Nullable. –