C# 使用相同类型的对象时生成强制转换异常

C# 使用相同类型的对象时生成强制转换异常,c#,asp.net,.net,dictionary,C#,Asp.net,.net,Dictionary,我以前使用静态变量来保存要在回发之间保存的变量数据。我遇到了一些问题,发现这些变量中的数据在appdomain结束时丢失。所以我做了一些研究,决定选择ViewState: static Dictionary<string, linkButtonObject> linkButtonDictonary; protected void Page_Load(object sender, EventArgs e) { if (ViewState["linkButtonDictona

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

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>();
    }
}
我正在向linkButtonDictionary添加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.Dictionary
2[System.String,linkButtonObject]无法强制转换为[B]System.Collections.Generic.Dictionary
2[System.String,linkButtonObject]。类型A源于“C:\Windows\Microsoft.Net\assembly\GAC\U 32\mscorlib\v4.0\U 4.0.0\U b77a5c561934e089\mscorlib.dll”位置的上下文“LoadNone”中的“mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”。类型B源于“C:\Windows\Microsoft.Net\assembly\GAC\U 32\mscorlib\v4.0\U 4.0.0\U b77a5c561934e089\mscorlib.dll”位置的上下文“LoadNone”中的“mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”


我不明白,当我在任何地方使用同一个类时,怎么会出现铸造问题。我做错了什么以及如何修复它?

这看起来与以下问题完全相同:

至于解决方案,您可能无法控制如何处理程序集负载等


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

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

我在.aspx.cs页面上有一个简单的类:

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

这就是为什么程序集加载了两次并导致了问题。

您设法在不同的加载上下文中加载了相同的程序集(mscorlib)。您是否使用
Assembly.LoadFrom()
或类似工具来加载mscorlib或其他将加载它的组件?您可以尝试使用Fusion日志查看器来跟踪问题:我不以编程方式加载任何程序集,甚至不知道mscorlib是什么。嗯,您已经设法做到了,可能是通过一些图书馆或别的什么间接的。Fusion Log Viewer应该可以帮助您。这本身并不能回答您的问题,但您可以尝试将对象放入
会话中。如果您关心appdomain重新启动,请使用状态服务器或SQL。有趣!!谢谢分享,所以这个问题至少有一个直接相关的解决方案!你好那么你把类定义放在哪里了?:)
[Serializable]
public class linkButtonObject
{
    public string storyNumber { get; set; }
    public string TaskName { get; set; }
}