【问题标题】:Can't Access Runtime Cache Using Reflection无法使用反射访问运行时缓存
【发布时间】:2019-04-11 11:35:46
【问题描述】:

我正在尝试获取 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() 它会编译,但我会从这部分返回 null:

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

我做错了什么?

我正在使用 .NET 4.5。 System.Web.Caching 是版本 4.0.0.0。

【问题讨论】:

    标签: asp.net-mvc caching reflection


    【解决方案1】:

    您应该使用website Microsoft 设置查找原始源代码,以了解HttpRuntime 类的更多详细信息,特别是Cache 属性。如果您查看line 2794 of the System.Web.HttpRuntime class,您可以看到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

    【讨论】:

    • 谢谢。这是一个如此清晰和翔实的答案,我真的很感激。但现在我不明白为什么其他答案对这么多人有用!
    • 这个问题是在 2008 年提出并在 2014 年回答的,因此他们使用的是较旧的 .NET 框架版本。可能是因为在以后的 .NET 版本中(我的猜测是 > 4.5),他们删除了公开的(实例化的)Getter 并将其替换为静态变体。我会更新你链接到的答案,这样其他用户就不会被这个问题困住了!
    • 我的印象是这适用于 4.5,而“重大变化”是 4.7.... 显然我错了。再次感谢 Jevgeni :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2020-08-09
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多