【问题标题】:InvalidCastException Dictionary<string, string> using Exception.DataInvalidCastException Dictionary<string, string> 使用 Exception.Data
【发布时间】:2013-10-13 01:15:27
【问题描述】:

我有一个正在使用的客户端/服务器包,我正在尝试使用 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 类吗?

【问题讨论】:

  • 异常消息很清楚,不清楚的部分是我通过谷歌在 ListDictionaryInternal 上找不到任何东西,而且我以前从未使用过 IDictionary 或 Exception.Data 所以我只是想从Stackoverflow 社区。​​span>

标签: c# dictionary exception-handling .net


【解决方案1】:

基本上,Exception.Data 的值不是Dictionary&lt;string, string&gt; - 所以当你它转换为Dictionary&lt;string, string&gt; 时,你会得到这个异常。

property itself 仅声明为IDictionary 类型。你不应该假设它是Dictionary&lt;string, string&gt;。您应该修复您的 ExceptionError 课程以避免这种假设。据记录,键是通常字符串,但这不能保证 - 同样不能保证值是字符串。

您可以通过仅转换适当的条目来执行从 IDictionaryDictionary&lt;string, string&gt; 的“安全”转换:

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

【讨论】:

    【解决方案2】:

    Exception.Data 输入(并记录)为IDictionary。另外,不要把它塞进object[]。相反,保留类型信息并将其作为形式参数发送到ExceptionError.Show

    【讨论】:

    • 有人不应该把它“塞”进一个对象[]中有什么原因吗?在这种情况下,我可以改变它真的没关系,只是想知道是否有一些性能损失或什么?
    • 原因是代码清晰和可维护性。表达式(Dictionary&lt;string, string&gt;)exceptionArgs[7] 不是不言自明的。感觉就像这里没有必要的 hack,因为我们可以添加另一个参数。我没有看到缺点。
    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多