c#:HttpRuntime.Cache产生无效的强制转换异常

时间:2012-05-22 08:51:52

标签: c# asp.net httpruntime.cache

以下内容如何产生"无效的强制转换异常" ???

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

不知道为什么你的代码失败了,但你可以尝试使用'softcast':

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

答案 2 :(得分:0)

好的,我终于成功了。

首先,我道歉,我错误地读了我的日志文件。 未出现例外情况

MyClass mc = (MyClass)entry.Value;

但来自

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

看起来Cache不能用KeyValuePair(我在互联网上找到的代码......)进行迭代。再一次,抱歉浪费你的时间在错误的方向搜索...无论如何,谢谢你的帮助!

现在对于有效的代码:

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