DebuggerDisplay在运行时解析为字符串

本文关键字:字符串 运行时 DebuggerDisplay | 更新日期: 2023-09-27 17:50:12

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

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

所以有可能得到在运行时调试器中显示的字符串吗?

DebuggerDisplay在运行时解析为字符串

我不这么认为(至少不需要您付出一些努力)—我刚刚做了一些挖掘,发现这是一篇关于调试器显示最佳实践的文章。这不是直接相关的,但它确实突出了一件事:

每个属性{表达式洞}必须被单独评估并这样做对于此类型的每个实例在每个调试器显示窗口。

我希望它使用调试器在代码被分解后进行评估(有点类似于当你在断点处使用立即窗口来评估语句)。

它的长和短的是,结果调试器显示值的对象是不可用的,在运行时,除非你愿意解析每个表达式漏洞,并使用反射来计算它们自己。

文章建议,提供调试器输出的最有效方法是使用私有方法执行String。设置要显示的所有属性的格式。您可能想要考虑将其作为公共方法(可能在接口上),并使用它从。

中检索异常信息。

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

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

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

当然,我假设您可以修改业务对象类,但情况可能并非如此……

从技术上讲,当然,这是可能的-您可以在运行时使用Reflection访问DebuggerDisplayAttribute并编写一些代码来解析字符串并再次使用Reflection来获取值。但是,如果在这些花括号中除了属性和字段之外还有其他内容,那么这将不起作用。

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