【问题标题】:c# : HttpRuntime.Cache produces invalid cast exceptionc#:HttpRuntime.Cache 产生无效的强制转换异常
【发布时间】:2012-05-28 17:56:48
【问题描述】:

以下如何产生“无效的强制转换异常”???

foreach (KeyValuePair<String,Object> entry in HttpRuntime.Cache)
{
    if (entry.Value.GetType() == typeof(MyClass))
    {
        MyClass mc = (MyClass)entry.Value; // ===> Invalid Cast Exception !!!

(对于那些问我为什么要这样做的人:我在缓存中/从缓存中随机添加和删除一些不同的对象,因此需要进行这种测试。我计划创建某种容器对象,将保存我的各种对象;我只会将这个对象推送到缓存中,但问题仍然存在:它会解决强制转换异常吗?)

【问题讨论】:

  • 不知道。我可能会使用as 和一个空检查。

标签: c# asp.net httpruntime.cache


【解决方案1】:

您是否处于进行动态(重新)编译的环境中?例如,如果代码文件发生更改,ASP.NET 网站会在运行时重新编译页面。他们将该页面编译为程序集并加载该程序集。即使运行时在某个时候卸载旧程序集,这仍然会为您提供与旧程序集不兼容的新类型。

我不知道,您是否可以通过某种版本控制或强命名来解决此问题。 但既然发生了变化,似乎不太可能,你会想要旧的类型。

【讨论】:

    【解决方案2】:

    不知道为什么您的代码会失败,但您可以通过“软广播”来尝试:

    foreach (KeyValuePair<String,Object> entry in HttpRuntime.Cache) 
    { 
         MyClass mc = entry.Value as MyClass;
         if (mc != null)     
         {         
              //Do your stuff
    

    【讨论】:

    • 如果 entry.Value 为 null 且当前未被捕获,也可以使用。
    • 如果该值为null,则原始代码中的entry.Value.GetType()中应该存在空指针异常。
    • 这就是我的意思,当您的代码处理该用例时,没有捕获异常。
    【解决方案3】:

    好吧,我终于成功了。

    首先,我很抱歉,我错误地阅读了我的日志文件。异常没有出现

    MyClass mc = (MyClass)entry.Value;
    

    但来自

    foreach (KeyValuePair<String,Object> entry in HttpRuntime.Cache)
    

    似乎无法使用 KeyValuePair 迭代缓存(我在互联网上找到的代码......)。再一次,很抱歉浪费您的时间在错误的方向上搜索......无论如何感谢您的帮助!

    现在是有效的代码:

    IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();
        while (CacheEnum.MoveNext()) {
            MyClass mc = ((DictionaryEntry)CacheEnum.Current).Value as MyClass;
            if (mc != null) {
                // Doing stuff...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-21
      • 2012-02-20
      • 1970-01-01
      • 2015-01-27
      • 2012-09-20
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多