-->

如何使[DebuggerDisplay]对于继承的类或至少与集合的工作?(How to make [

2019-06-25 10:33发布

我有这从继承的类List<MagicBean> 它运作良好,并预期在各方面,除了一个:当我加入[DebuggerDisplay]属性。 即使看着列表中包含了其作为[DebuggerDisplay("Count = {Count}")] ,如果我这么多的复制并粘贴到我的,我失去了直接在所有MagicBeans的看我有没有钻进能力碱 - >在调试私有成员。

如何获得两全其美吗? IE:在值列自定义值,和Visual Studio不能向我隐瞒我的魔豆?

Answer 1:

你可以得到你所需要使用的效果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中的继承列表的一个实例“计数= 3”的消息,并在列表中的项目的看法,当你展开根节点,而不必深入到基本属性。

使用ToString()来明确获得调试输出是不是一个好方法,当然,除非你已经重写ToString()用在其他地方你的代码,在这种情况下,你可以利用它。



Answer 2:

在看“后使用DebuggerDisplay属性 MSDN上的”文章,他们认为你可以重写你的类的ToString()函数作为替代选项,而不是使用DebuggerDisplay属性。 覆盖toString()方法,也不会隐藏自己的豆子。

如果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; }
    }    
}


Answer 3:

使用DebuggerDisplay属性,像这样:

[DebuggerDisplay("ID:{ID},Customers:{Customers==null?(int?)null:Customers.Count}")]`
class Project
{
    int ID{get;set;}
    IList<Customer> Customers{get;set;}
}

一些更多的信息在这里 。



文章来源: How to make [DebuggerDisplay] respect inherited classes or at least work with collections?