InvalidCastException Dictionary <string,string =“”>使用Exception.Data </string,>

时间:2013-10-06 11:24:00

标签: c# dictionary exception-handling .net

我有一个我正在玩的客户端/服务器包,我试图使用Exception.Data将自定义信息传递到一个单独的类(ExceptionError)以传递给MessageBox。

当我尝试连接到服务器而没有实际启动服务器来侦听连接时,以下捕获进程。只是对该部分的疏忽,监听连接不是实际问题,但它向我展示了Exception.Data的问题。

catch (Exception e)
{
    e.Data["SourceFile"] = "Client.cs";
    e.Data["MethodName"] = "Send_CommandToServer";
    e.Data["ExceptionType"] = "Exception";
    object[] exceptionArgs = new object[8] { null, e.InnerException, 
                              e.Message, null, e.Source, e.StackTrace, 
                              e.TargetSite, e.Data };
    ExceptionError.Show(exceptionArgs);
}

以下是抛出InvalidCastException的ExceptionError类中的行:

Dictionary<string,string> data = (Dictionary<string, string>)exceptionArgs[7];
 // exceptionArgs[7] is Exception.Data

以下是我收到的实际错误:

  

无法将'System.Collections.ListDictionaryInternal'类型的对象强制转换为'System.Collections.Generic.Dictionary`2 [System.String,System.String]'。

我找不到任何有关ListDictionaryInternal的内容,我所做的大多数谷歌搜索都指向System.Collections.Specialized.ListDictionary,它会产生自己的问题。有没有人知道关于ListDictionaryInternal的任何信息,或者你能帮助我将e.Data传递给我的ExceptionError类吗?

2 个答案:

答案 0 :(得分:8)

基本上,Exception.Data的值不是Dictionary<string, string> - 因此,当您投射到Dictionary<string, string>时,您会收到此异常。

property itself仅声明为IDictionary类型。你不应该认为它是Dictionary<string, string>。您应该修复ExceptionError类以避免这种假设。据记载,密钥通常是字符串,但不保证 - 同样不能保证值是字符串。

您只需转换相应的条目即可执行从IDictionaryDictionary<string, string>的“安全”转换:

var dictionary = original.Cast<DictionaryEntry>()
                         .Where(de => de.Key is string && de.Value is string)
                         .ToDictionary(de => (string) de.Key,
                                       de => (string) de.Value);

答案 1 :(得分:2)

Exception.Data被输入(并记录)为IDictionary。另外,请勿将其填入object[]。相反,保留类型信息并将其作为形式参数发送到ExceptionError.Show