generics类上的DebuggerDisplay

我在generics类上应用DebuggerDisplay属性时遇到问题:

 [DebuggerDisplay("--foo--")] class Foo { } [DebuggerDisplay("Bar: {t}")] class Bar { public T t; } 

当检查Bar类型的对象时,我希望它显示为Bar: --foo-- ,但我得到Bar: {Foo}

我究竟做错了什么?

DebuggerDisplay属性不是递归的。 字符串中的{}基本上是评估此表达式并以内联方式显示结果。 计算内部结果的字符串,就好像没有类型或成员的DebuggerDisplay属性。 这就是为什么你看到{Foo}而不是–foo–。

原因是可靠性。 拥有相互递归的DebuggerDisplay属性标签太容易了。 在评估内部表达式时,这会导致堆栈溢出或无限循环。 不递归地评估DebuggerDisplay属性可以防止这种无限递归(尽管用户仍然很可能在特定表达式中自己创建它)。

控制内部表达式显示方式的一种方法是覆盖.ToString()方法。 在计算内部表达式的显示字符串时,将对此进行评估。

[免责声明:我隶属于OzCode]

您可以使用OzCode的Revealfunction,该function支持嵌套/递归调试信息。 在此处输入图像描述
为实例定义后,它将自动用于该类型的所有实例。

您可以使用[DebuggerDisplay("Bar<{typeof(T).Name}>,nq}")]//nq - no quotes

您还可以使用以下实践: DebuggerDisplay属性最佳实践