我正在尝试获取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
,您不能使用正在使用的绑定标志,因为现在您正在寻找属于Instance
的NonPublic
成员。在.NET中,静态变量不属于实例,因此您发布的代码将导致抛出异常;它根本找不到您要查找的成员,因为它不存在于您提供的实例中——但是它存在于您要查找类的类型定义中(HttpRuntime
(。
为了使您的代码正常工作,您将需要省略绑定标志,处理您的请求的内部.NET代码现在将理解我们正在尝试查找一个静态方法:HttpRuntime.Cache.GetType().GetMethod("Get")
。注意:如果您想要具有绑定标志(可读性、可理解性(,您可以添加:BindingFlags.Public | BindingFlags.Static
,它的作用与您省略标志时的作用完全相同。
如果您想执行该方法并获得结果(获得实际的Cache
(,您可以使用Invoke(null, null)
调用刚刚从GetMethod
收到的MethodDefinition
。