我有一个继承自List<MagicBean>
的课程。除了一个:当我添加[DebuggerDisplay]
属性时,它在所有方面都运行良好且符合预期。即使看着List有[DebuggerDisplay("Count = {Count}")]
,如果我将其复制并粘贴到我的身上,我也无法直接查看我所拥有的所有MagicBeans而无需钻入base-&gt;私有成员调试。
我如何充分利用这两个世界? IE:值列中的自定义值,而Visual Studio没有隐藏我的魔豆?
答案 0 :(得分:11)
您可以使用DebuggerTypeProxy属性获得所需的效果。您需要创建一个类来对您继承的列表进行调试“可视化”:
internal sealed class MagicBeanListDebugView
{
private List<MagicBean> list;
public MagicBeanListDebugView(List<MagicBean> list)
{
this.list = list;
}
[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
public MagicBean[] Items{get {return list.ToArray();}}
}
然后,您可以声明此类以供调试器用于显示您的类以及DebuggerDisplay
属性:
[DebuggerDisplay("Count = {Count}")]
[DebuggerTypeProxy(typeof(MagicBeanListDebugView))]
public class MagicBeanList : List<MagicBean>
{}
当您将鼠标悬停在Visual Studio中的继承列表实例上时,这将为您提供“Count = 3”消息,并在展开根节点时显示列表中项目的视图,而无需向下钻取基本属性。
使用ToString()
来专门获取调试输出不是一个好方法,除非你已经覆盖了ToString()
以便在其他地方的代码中使用,在这种情况下你可以使用它。 / p>
答案 1 :(得分:3)
在查看MSDN上的“Using DebuggerDisplay Attribute”文章后,他们建议您可以覆盖类的ToString()函数作为备用选项,而不是使用DebuggerDisplay属性。覆盖ToString()方法也不会隐藏你的bean。
如果C#对象被覆盖 ToString(),调试器将调用 覆盖并显示其结果 标准{}。 因此,如果 你已经覆盖了ToString() 不必使用DebuggerDisplay。如果 你同时使用DebuggerDisplay 属性优先于 ToString()覆盖。
您是否可以覆盖类上的ToString()方法,或者您是否将其用于其他目的?
我不知道你是否已经考虑过这个问题,但是我想我会建议它只是有所帮助。 : - )
为了完整性,所以其他任何人都可以快速嘲笑它;这是我做的一个简单例子:
namespace StackOverflow
{
//broken BeanPouch class that uses the DebuggerDisplay attribute
[System.Diagnostics.DebuggerDisplay("Count = {Count}")]
class BrokenBeanPouch : List<MagicBean>
{ }
//working BeanPouch class that overrides ToString
class WorkingBeanPouch : List<MagicBean>
{
public override string ToString()
{
return string.Format("Count = {0}", this.Count);
}
}
class Program
{
static WorkingBeanPouch myWorkingBeans = new WorkingBeanPouch()
{
new MagicBean() { Value = 4.99m }, new MagicBean() { Value = 5.99m }, new MagicBean() { Value = 3.99m }
};
static BrokenBeanPouch myBrokenBeans = new BrokenBeanPouch()
{
new MagicBean() { Value = 4.99m }, new MagicBean() { Value = 5.99m }, new MagicBean() { Value = 3.99m }
};
static void Main(string[] args)
{
//break here so we can watch the beans in the watch window
System.Diagnostics.Debugger.Break();
}
}
class MagicBean
{
public decimal Value { get; set; }
}
}
答案 2 :(得分:0)