FieldInfo.GetValue nullo cambio di un membro privato, mentre debugger indica campo non è nulla?

StackOverflow https://stackoverflow.com/questions/4441561

  •  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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top