Nelze získat přístup k běhu Cache s využitím odrazu

hlasů
1

Snažím se dostat datum ukončení platnosti na HttpRuntime.Cacheobjekt, podle této odpovědi:

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

Tato metoda je:

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;
}

Když se snažím používat výše uvedené metody, bude první řádek není kompilace:

odkaz na objekt je nutné pro object.GetType ()

Kdybych nahradit Cache.GetType()s HttpRuntime.Cache.GetType()ním zkompiluje, ale dostanu null vrátil z této části:

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

Co dělám špatně?

Já používám .NET 4.5. System.Web.Caching je verze 4.0.0.0.

Položena 07/11/2018 v 23:50
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Měli jste se podíval na původní zdroj pomocí webové stránky nastavení Microsoft, aby se dozvědět více podrobností o HttpRuntimetřídu, konkrétně Cachevlastnost. Podíváte-li se na lince 2794 ve třídě System.Web.HttpRuntime můžete vidět následující definici Cachenemovitosti:

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

Teď, protože je vlastnost staticnemůžete použít závazné vlajky, který používáte, protože právě teď hledáte pro NonPublicčlena, který patří k Instance. NET statické proměnné nepatří k instanci, pro ně kód, který zaslali bude mít za následek výjimku vymrštění; to prostě nemůže najít člena, který hledáte, protože to existuje na instanci, kterou jste zadali - to však existuje na definice typu třídy, kterou hledáte do ( HttpRuntime).

Aby byl váš kód fungovat, budete muset vynechat závazné vlajky, interní kód .NET, který zpracovává váš požadavek nyní bude rozumět se snažíme vyhledávání statickou metodu: HttpRuntime.Cache.GetType().GetMethod("Get"). Poznámka: Chcete-li mít bindingflags (čitelnost, understandabilty), můžete přidat: BindingFlags.Public | BindingFlags.Static, což přesně to samé, jako vždy, když vynecháte vlajky.

Chcete-li spustit metodu a získat výsledek (získat skutečný Cache) můžete vyvolat MethodDefinitionprávě obdržel od GetMethodpoužívání Invoke(null, null).

Odpovězeno 08/11/2018 v 08:23
zdroj uživatelem

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