C# InvalidCastException字典<;字符串,字符串>;使用Exception.Data

C# InvalidCastException字典<;字符串,字符串>;使用Exception.Data,c#,dictionary,exception-handling,.net,C#,Dictionary,Exception Handling,.net,我有一个正在使用的客户机/服务器包,我试图使用Exception.Data将自定义信息传递到单独的类(ExceptionError)中,以传递到MessageBox中 当我尝试连接到服务器而不实际启动服务器以侦听连接时,将执行以下捕获过程。只是这方面的一个疏忽,监听连接并不是真正的问题,但它向我展示了异常数据的问题 catch (Exception e) { e.Data["SourceFile"] = "Client.cs"; e.Data["MethodName"] = "S

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

当我尝试连接到服务器而不实际启动服务器以侦听连接时,将执行以下捕获过程。只是这方面的一个疏忽,监听连接并不是真正的问题,但它向我展示了异常数据的问题

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);
}
下面是ExceptionError类中抛出InvalidCastException的行:

Dictionary<string,string> data = (Dictionary<string, string>)exceptionArgs[7];
 // exceptionArgs[7] is Exception.Data
Dictionary data=(Dictionary)exceptionArgs[7];
//exceptionArgs[7]是Exception.Data
以下是我收到的实际错误:

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


我找不到任何关于ListDictionaryInternal的信息,我做的大多数google搜索都指向System.Collections.Specialized.ListDictionary,它会产生自己的问题。是否有人了解ListDictionaryInternal,或者您能帮助我将e.数据传递到我的ExceptionError类中?

IDictionary
的形式键入(并记录)。另外,不要将其填充到
对象[]
中。相反,保留类型信息并将其作为形式参数发送到
ExceptionError.Show

基本上,
Exception.Data
的值不是
字典
-因此,当您将其强制转换到
字典
时,您会得到此异常

仅声明类型为
IDictionary
。你不应该假设它是一本
字典
。您应该修复
ExceptionError
类以避免这种假设。有文献记载,键通常是字符串,但这并不能保证——同样,也不能保证值是字符串

通过仅转换适当的条目,您可以执行从
IDictionary
Dictionary
的“安全”转换:

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

异常信息非常清楚,不清楚的部分是我无法通过google在ListDictionaryInternal上找到任何内容,而且我以前从未使用过IDictionary或Exception.Data,所以我只是想从Stackoverflow社区获得一些见解。有没有理由不应该将其“塞进”对象[]?在这种情况下,我真的不在乎我可以改变它,只是想知道是否有一些性能损失或什么?原因是代码的清晰性和可维护性。表达式
(字典)exceptionArgs[7]
不是自解释的。这感觉像是一个没有必要的黑客,因为我们可以添加另一个参数。我看不出有什么坏处。