Не удается получить доступ к кешу выполнения с помощью отражения - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь получить дату истечения срока действия объекта HttpRuntime.Cache согласно этому ответу:

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

Метод:

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

Когда я пытаюсь использовать вышеуказанный метод, первая строка не компилируется:

Для object требуется ссылка на объект. GetType ()

Если я заменим Cache.GetType() на HttpRuntime.Cache.GetType(), он скомпилируется, но из этой части будет возвращен нуль:

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

Что я делаю не так?

Я использую .NET 4.5. System.Web.Caching - версия 4.0.0.0.

1 Ответ

0 голосов
/ 08 ноября 2018

Вам нужно было поискать исходный источник с помощью веб-сайта в настройках Microsoft, чтобы узнать больше информации о классе HttpRuntime, в частности о свойстве Cache. Если вы посмотрите на строку 2794 класса System.Web.HttpRuntime , вы увидите следующее определение свойства Cache:

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

Теперь, поскольку свойство static, вы не можете использовать флаги привязки, которые вы используете, поскольку сейчас вы ищете NonPublic член, который принадлежит Instance. В .NET статические переменные не принадлежат экземпляру, поэтому опубликованный вами код приведет к возникновению исключения; он просто не может найти искомого члена, поскольку он не существует в предоставленном вами экземпляре - однако он существует в определении типа класса, в который вы просматриваете (HttpRuntime).

Чтобы ваш код работал, вам нужно будет пропустить флаги привязки, теперь внутренний .NET-код, обрабатывающий ваш запрос, поймет, что мы пытаемся найти статический метод: HttpRuntime.Cache.GetType().GetMethod("Get"). Примечание: если вы хотите иметь флаги привязки (читабельность, понимаемость), вы можете добавить: BindingFlags.Public | BindingFlags.Static, что точно так же, как всякий раз, когда вы опускаете флаги.

Если вы хотите выполнить метод и получить результат (получите Cache), вы можете вызвать MethodDefinition, который вы только что получили от GetMethod, используя Invoke(null, null).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...