DebuggerDisplay在运行时解析为字符串

时间:2011-04-15 10:26:24

标签: c# attributes error-handling debugging

有没有办法在运行时访问DebuggerDisplayAttribute显示的字符串?

对于我们的业务对象,我尝试获取有关异常处理的自动调试器信息。捕获异常时使用的实际对象应序列化为文本以增强异常消息。由于某些属性具有其他业务对象作为类型,因此如果递归使用,这可能会变得非常长。因此,我想序列化只是已经在类的DebuggerDisplay属性中定义的信息。类的ToString()实现可能不同,不能用于此任务。

那么可以在运行时获取调试器中显示的字符串吗?

3 个答案:

答案 0 :(得分:5)

我不这么认为(至少在你没有做出一些努力的情况下) - 我刚刚做了一些挖掘,并发现了一篇关于Debugger Display Best Practices的文章。它没有直接关系,但确实强调了一件事:

  

每个属性{expression hole}都必须   单独评估并完成评估   对于这种类型的每个实例一次   在每个调试器显示窗口中。

我希望在代码被破解后使用调试器进行评估(类似于在断点时使用立即窗口评估语句的方式)。

除非你愿意解析每个表达式漏洞并使用反射来自己评估它们,否则它在运行时无法获得对象的结果调试器显示值。

本文建议提供调试器输出的最有效方法是让私有方法对要显示的所有属性执行String.Format。您可能需要考虑将其设置为公共方法(可能在接口上)并使用此方法从中检索异常信息。

答案 1 :(得分:2)

可能有一些方法可以提取这些信息,但用这样的属性重新定义这些类不是更容易:

[DebuggerDisplay("{InfoProperty}")]
class X {
    public string InfoProperty {
        get { return "Debug and display info here"; }
    }
}

然后在错误消息/日志中包含InfoProperty,而不是挖掘Visual Studio重建显示数据的方式。

当然我假设你可以修改业务对象类,这可能不是这种情况......

答案 2 :(得分:0)

从技术上讲,确定,这是可能的 - 您可以access the DebuggerDisplayAttribute at runtime with Reflection并编写一些解析字符串的代码并再次使用Reflection来获取值。 如果除了那些大括号内的属性和字段之外还有其它东西,这将无效。

无论如何,我强烈建议你留意迈克或保罗的建议 - 如果你需要改变数百个课程 - 然后找到一种方法来自动改变它们 - 或者像Resharper的结构一样 搜索和替换,或正则表达式 - 它不应该花太长时间。