调试器显示在运行时解析为字符串

19

有没有一种方法可以在运行时访问 DebuggerDisplayAttribute 显示的字符串?

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

那么,在运行时是否有可能获取在调试器中显示的字符串?

3个回答

5
我不这样认为(至少需要你付出一些努力)- 我刚刚查找了一些内容,发现了一篇关于“调试器显示最佳实践”的文章。虽然不是直接相关的,但它确实强调了一件事情:
每个属性{表达式空}必须单独评估,并且在每个调试器显示窗口中的此类型的每个实例中都要进行评估。
我希望它使用调试器来在代码被打断后进行评估(有点类似于您在断点时使用立即窗口来评估语句)。
长话短说,除非您愿意解析每个表达式空并使用反射自己进行评估,否则对象的调试器显示值在运行时不可用。
文章建议提供调试器输出的最有效方法是让一个私有方法对您想要显示的所有属性进行String.Format。您可能希望考虑将其作为公共方法(可能在接口上)并使用它从中检索异常信息。

2

可能有一些方法可以提取这些信息,但重新定义那些类并加上一个属性不是更容易吗?例如:

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

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

当然,我假设您可以修改业务对象类,但这可能并非总是如此...


1
那将是我的最后一步,但这意味着必须重新设计一百个类。 - Oliver Friedrich

0

从技术上讲,当然可以 - 你可以使用反射在运行时访问DebuggerDisplayAttribute并编写一些代码来解析字符串,然后再次使用反射获取值。但是,如果花括号内有除属性和字段以外的任何内容,这种方法就不起作用了。

无论如何,我强烈建议你听取Mike或Paolo的建议 - 如果你需要更改数百个类 - 那么找到一种自动更改它们的方法 - 可以使用Resharper的结构搜索和替换,或者使用正则表达式 - 这不应该花费太长时间。


2
DebuggerDisplay 还支持方法调用,例如 [DebuggerDisplay("{ToString()}")] - JotaBe
@JotaBe 我不知道这个语法,我正在搜索是否可以实现一个ToString,其语法与我的DebuggerDisplayAttribute相同。但反过来也可以。谢谢。 - MuiBienCarlota
在这种情况下,为什么要使用DebuggerDisplay? - ironic
1
调用ToString()是调试器的默认行为。然而,一般来说最好避免重写ToString()。重写此方法会创建难以维护的代码,因为很难找到调用此特定ToString()实现的位置。因此,当您修改ToString()实现时,几乎永远不会知道是否破坏了某些东西。出于这个原因,如果您只想在调试器中显示某些内容,DebuggerDisplay是更好的选择。 - ironic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接