Asp.net mvc Can';t使用反射访问运行时缓存

Asp.net mvc Can';t使用反射访问运行时缓存,asp.net-mvc,caching,reflection,Asp.net Mvc,Caching,Reflection,我正在尝试获取HttpRuntime.Cache对象的过期日期,如下所示: 方法是: private DateTime GetCacheUtcExpiryDateTime(string cacheKey) { object cacheEntry = Cache.GetType().GetMethod("Get", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(Cache, new object[] { cacheKey,

我正在尝试获取
HttpRuntime.Cache
对象的过期日期,如下所示:

方法是:

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()
,它将编译,但从该部分返回null:

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

我做错了什么


我正在使用.NET4.5。System.Web.Caching是4.0.0.0版。

您应该使用Microsoft安装程序查找原始源代码,以了解
HttpRuntime
类的更多详细信息,特别是
Cache
属性。如果查看,可以看到
缓存
属性的以下定义:

 public static Cache Cache {
        get {
              ...
        }
 }
现在,由于属性是静态的,您不能使用正在使用的绑定标志,因为现在您正在查找属于实例的非公共成员。NET中的静态变量不属于实例,因此您发布的代码将导致抛出异常;它根本找不到您要查找的成员,因为它不存在于您提供的实例中——但它确实存在于您要查找的类的类型定义中(
HttpRuntime

为了使代码正常工作,您需要省略绑定标志,处理您请求的内部.NET代码现在将理解我们正在尝试查找一个静态方法:
HttpRuntime.Cache.GetType().GetMethod(“Get”)
。注意:如果希望具有bindingflags(可读性、可理解性),可以添加:
bindingflags.Public | bindingflags.Static
,这与忽略标志时的操作完全相同


如果要执行该方法并获得结果(获取实际的
缓存
),可以使用
invoke(null,null)
调用刚刚从
GetMethod
收到的
MethodDefinition
,谢谢。这是一个如此明确和翔实的答案,我真的很感激。但现在我不明白为什么其他答案对这么多人有效!这个问题是在2008年提出的,在2014年得到了回答,因此他们使用的是较旧的.NET framework版本。可能是因为在以后的.NET版本中(我猜是>4.5),他们删除了公开(实例化)的Getter,并用静态变量替换了它。我会更新你链接到的答案,这样其他用户就不会陷入这个问题!我得到的印象是,这适用于4.5,而“突破性变化”是4.7。。。。显然我错了。再次感谢杰夫格尼:)