【问题标题】:Cast exception being generated when using the same type of object使用相同类型的对象时生成强制转换异常
【发布时间】:2013-11-12 01:27:19
【问题描述】:

我以前使用静态变量来保存我想在回发之间保存的可变数据。我遇到了问题,发现这些变量中的数据在 appdomain 结束时丢失了。所以我做了一些研究并决定使用 ViewStates:

static Dictionary<string, linkButtonObject> linkButtonDictonary;


protected void Page_Load(object sender, EventArgs e)
{
    if (ViewState["linkButtonDictonary"] != null)
    {
        linkButtonDictonary = (Dictionary<string, linkButtonObject>)ViewState["linkButtonDictonary"];
    }
    else
    {
        linkButtonDictonary = new Dictionary<string, linkButtonObject>();
    }
}

这是我使用的非常简单的类:

[Serializable]
public class linkButtonObject
{
    public string storyNumber { get; set; }
    public string TaskName { get; set; }
}

我正在添加到 linkBut​​tonDictionary,因为 gridview 是数据绑定的:

protected void hoursReportGridView_OnRowDataBound(Object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        LinkButton btn = (LinkButton)e.Row.FindControl("taskLinkButton");
        linkButtonObject currentRow = new linkButtonObject();
        currentRow.storyNumber = e.Row.Cells[3].Text;
        currentRow.TaskName = e.Row.Cells[5].Text;
        linkButtonDictonary.Add(btn.UniqueID, currentRow);
    }
}

看来我以前的问题已经解决了,但是又出现了一个新问题。有时当我回发时,我会收到此错误:

[A]System.Collections.Generic.Dictionary2[System.String,linkButtonObject] cannot be cast to [B]System.Collections.Generic.Dictionary2[System.String,linkBut​​tonObject]。类型 A 源自 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 在位置 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0 的上下文 'LoadNeither' .0__b77a5c561934e089\mscorlib.dll'。类型 B 源自 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 在位置 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0 的上下文 'LoadNeither' .0__b77a5c561934e089\mscorlib.dll'。

我不明白当我在任何地方都使用同一个类时,怎么会出现转换问题。我做错了什么,我该如何解决?

【问题讨论】:

  • 不知何故,您设法在不同的加载上下文中加载了相同的程序集 (mscorlib)。您是否使用Assembly.LoadFrom() 或类似方法来加载 mscorlib 或其他会加载它的组件?
  • 您可以尝试使用 Fusion Log Viewer 来追踪问题:msdn.microsoft.com/en-us/library/e74a18c4%28VS.71%29.aspx
  • 我没有以编程方式加载任何程序集,甚至不知道 mscorlib 是什么。
  • 嗯,你已经设法做到了,可能是通过一些图书馆或其他东西间接地做到了。 Fusion Log Viewer 应该可以帮助您。
  • 这本身并不能回答您的问题,但您可以尝试将对象放入Session。如果您担心 appdomain 重新启动,请使用 State Server 或 SQL。

标签: c# asp.net .net dictionary


【解决方案1】:

感谢大家的意见,它帮助我找到了问题。

我在 .aspx.cs 页面中有我的简单课程:

[Serializable]
public class linkButtonObject
{
    public string storyNumber { get; set; }
    public string TaskName { get; set; }
}

这就是程序集加载两次并导致问题的原因。

【讨论】:

  • 有趣!!感谢分享,所以至少这个问题有一个直接相关的解决方案!
  • 嗨。那你把类定义放在哪里了? :)
【解决方案2】:

这看起来与以下问题完全一样:

InvalidCastException when serializing and deserializing

至于解决方案,处理程序集负载等可能超出您的控制范围。

一种简单的方法是 XML Serialize/JSON 将您的数据序列化为字符串并将该字符串保存在 ViewState 中。要取回它,您只需要反转该过程。这肯定会解决重复加载问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多