如何使[DebuggerDisplay]尊重继承的类或至少使用集合?

时间:2009-07-08 20:59:25

标签: c# visual-studio visual-studio-2008 debugging visual-studio-2008-sp1

我有一个继承自List<MagicBean>的课程。除了一个:当我添加[DebuggerDisplay]属性时,它在所有方面都运行良好且符合预期。即使看着List有[DebuggerDisplay("Count = {Count}")],如果我将其复制并粘贴到我的身上,我也无法直接查看我所拥有的所有MagicBeans而无需钻入base-&gt;私有成员调试。

我如何充分利用这两个世界? IE:值列中的自定义值,而Visual Studio没有隐藏我的魔豆?

3 个答案:

答案 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)

使用DebuggerDisplay属性,如下所示:

Virtual Directory

更多信息here