2008-11-03 55 views
12

我有一个泛型类应用DebuggerDisplay属性的问题:DebuggerDisplay对泛型类

[DebuggerDisplay("--foo--")] 
class Foo 
{ 
} 

[DebuggerDisplay("Bar: {t}")] 
class Bar<T> 
{ 
    public T t; 
} 

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

我在做什么错?

回答

19

DebuggerDisplay属性不是递归的。字符串内部的{}实质上是评估这个表达式,并在行内显示结果。计算内部结果的字符串,就好像在类型或成员中不存在DebuggerDisplay属性一样。这就是为什么你看到{Foo}而不是--foo--。

其原因是可靠性。具有相互递归的DebuggerDisplay属性标记太简单了。这会在评估内部表达式时导致堆栈溢出或无限循环。不递归评估DebuggerDisplay属性可以防止这种无限递归(尽管用户仍然可以在特定表达式中自行创建它)。可以控制显示内表达的方式

的一种方式是通过重写的ToString()方法。计算内部表达式的显示字符串时将对此进行评估。

+0

谢谢!因此,我想,这与通用性无关。 我会去ToString解决方案。 – 2008-11-03 15:27:24

0

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

您也可以使用这些做法: DebuggerDisplay attribute best practices

+0

我相信它应该是: `[DebuggerDisplay(“Bar <{typeof(T).Name,nq}>”)]` – DavWEB 2017-05-18 11:06:16

2

[免责声明:我与OzCode附属]

您可以使用OzCode的显示功能,支持嵌套/递归调试信息。 enter image description here
一旦你把它定义为一个实例,将自动为该类型的所有实例使用。