无法将“System.String”类型的对象强制转换为“System.Collections.Hashtable”类型

时间:2010-10-06 14:29:04

标签: c# collections hashtable

我将应用程序级变量转换为Hashtable时出现此错误;

首先在Global.aspx文件中,我将Hashtable存储到Application变量中,如下所示:

Hashtable htErrorDescription = new Hashtable();
htErrorDescription.Add("Error 1","General Error");
htErrorDescription.Add("Error 2","Service Error");

context.Application["htErrorDescription"] = htErrorDescription + "";

之后我想从应用程序级变量中获取此Hashtable。

Hashtable htOutput;
htOutput = (Hashtable)context.Application["htErrorDescription"];

我收到此错误。

请帮我解决这个错误, 提前完成。

3 个答案:

答案 0 :(得分:4)

当你这样做时:

Application["Application["htErrorDescription"] = htErrorDescription + "";

它正在隐式地将htErrorDescription转换为字符串。你需要摆脱:

+ ""

另外,我认为这甚至不会编译,你是不是错过了一个结束的]字符,你是否在不使用反斜杠来嵌套引号来逃避它们?

修改 我看到你编辑了你的问题,所以你现在需要做的就是删除+ ""

答案 1 :(得分:1)

首先,停止使用字符串连接字典,因为这意味着您在应用程序集合中存储的内容是Hashtable.ToString()的结果,它只是字符串“System.Collections.Hashtable”。

这只是一个漏洞,但是你的大问题是你在应用范围内存储特定操作的错误字典。

考虑两个人(Alice和Bob,只是为了传统)同时访问Web应用程序。 IIS从其请求队列中获取两个请求,指定一个工作线程来处理每个请求,到目前为止一切都很顺利。

Alice的操作检查她的帐户已付清。创建错误表并非如此,我们在描述“帐户未付款”时添加了错误,并将其分配给应用程序范围的变量。

与此同时,Bob的操作正在尝试创建一个商务会议,但他犯了一个错误并将其设置为上个月,所以错误说“你不能在过去创建商务会议”被分配到一个新表错误,并分配给应用程序范围的变量。

这些发生在大致相同的时间,所以它基本上是随机的,现在在错误表中。

Alice现在收到错误消息。也许这是正确的,也许是过去对商务会议的废话,对她来说毫无意义。爱丽丝很有可能向科技抱怨。

同时Bob也会收到错误消息。也许这是正确的,或者当他知道自己有这个事实时,可能会抱怨他没有支付账单。 Bob很有可能在运营网站的公司中抱怨开具发票或直接投诉。这可能比他抱怨科技更糟糕。

如果需要将对象传递给同一Web请求处理的后续部分,请使用HttpContext的Items属性。

答案 2 :(得分:0)

将对象放入Application,如下所示:

context.Application["htErrorDescription"] = htErrorDescription;