Kann nicht Runtime Cache-Zugriff mithilfe von Reflektion

stimmen
1

Ich versuche , das Ablaufdatum eines zu bekommen HttpRuntime.CacheObjekt, wie pro diese Antwort:

https://stackoverflow.com/a/350374/1778169

Das Verfahren ist:

private DateTime GetCacheUtcExpiryDateTime(string cacheKey)
{
    object cacheEntry = Cache.GetType().GetMethod(Get, BindingFlags.Instance | BindingFlags.NonPublic).Invoke(Cache, new object[] { cacheKey, 1 });
    PropertyInfo utcExpiresProperty = cacheEntry.GetType().GetProperty(UtcExpires, BindingFlags.NonPublic | BindingFlags.Instance);
    DateTime utcExpiresValue = (DateTime)utcExpiresProperty.GetValue(cacheEntry, null);    
    return utcExpiresValue;
}

Wenn ich versuche, das obige Verfahren zu verwenden, wird die erste Zeile nicht kompilieren:

Eine Objektreferenz ist erforderlich für Object.GetType ()

Wenn ich ersetzen Cache.GetType()mit HttpRuntime.Cache.GetType()kompiliert, aber ich habe null aus diesem Teil zurückgegeben:

cacheType.GetMethod(Get, BindingFlags.Instance | BindingFlags.NonPublic).

Was mache ich falsch?

Ich bin mit .NET 4.5. System.Web.Caching ist die Version 4.0.0.0.

Veröffentlicht am 07/11/2018 um 23:50
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
2

Sie sollten die ursprüngliche Quelle mit der nachgeschlagen Website Microsoft Setup , um weitere Informationen zu der herauszufinden HttpRuntimeKlasse, nämlich die CacheEigenschaft. Wenn man sich anschaut , Linie 2794 der System.Web.HttpRuntime Klasse können Sie die folgende Definition der siehe CacheEigenschaft:

 public static Cache Cache {
        get {
              ...
        }
 }

Da nun die Eigenschaft statickönnen Sie nicht die Bindung Flaggen verwenden Sie verwenden, da jetzt sie ein suchen NonPublicMitglied , das zu einem gehört Instance. In .NET statische Variablen gehören nicht zu einer Instanz, dafür der Code , den Sie geschrieben in einer Ausnahme ausgelöst führen wird; es kann einfach nicht das Element finden , die Sie suchen, da es auf der Instanz nicht vorhanden Sie zur Verfügung gestellt - es jedoch von der Art Definition der Klasse in der Sie suchen (nicht vorhanden HttpRuntime).

Um Ihren Code Arbeit zu machen, müssen Sie die Bindung Flaggen, den internen .NET - Code verzichten , die Ihre Anfrage wird nun behandelt verstehen wir eine statische Methode zum Nachschlagen versuchen: HttpRuntime.Cache.GetType().GetMethod("Get"). Hinweis: Wenn Sie Binding haben wollen (Lesbarkeit, understandabilty), könnte man hinzufügen: BindingFlags.Public | BindingFlags.Static, das ist genau die gleiche Funktion wie , wann immer Sie die Flaggen weglassen.

Wenn Sie die Methode ausgeführt werden soll und das Ergebnis zu erhalten (bekommen die tatsächliche Cache) können Sie aufrufen , die MethodDefinitionSie gerade aus dem empfangenen GetMethodverwenden Invoke(null, null).

Beantwortet am 08/11/2018 um 08:23
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more