无法使用反射访问运行时缓存



我正在尝试获取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;
}

当我尝试使用上述方法时,第一行不会编译:

对象需要对象引用。GetType((

如果我用HttpRuntime.Cache.GetType()替换Cache.GetType(),它会编译,但我从这个部分返回null:

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

我做错了什么?

我使用的是.NET 4.5。System.Web.Caching的版本为4.0.0.0。

您应该使用Microsoft网站设置查找原始源,以便了解HttpRuntime类的更多详细信息,特别是Cache属性。如果查看System.Web.HttpRuntime类的第2794行,可以看到Cache属性的以下定义:

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

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

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

如果您想执行该方法并获得结果(获得实际的Cache(,您可以使用Invoke(null, null)调用刚刚从GetMethod收到的MethodDefinition

最新更新