14

から継承するクラスがありList<MagicBean>ます。[DebuggerDisplay]属性を追加すると、1つを除いてすべての点で期待どおりに機能します。Listを見るのと[DebuggerDisplay("Count = {Count}")]同じですが、それをコピーして自分のものに貼り付けると、デバッグ中にbase-> privateメンバーにドリルダウンせずに、持っているすべてのMagicBeanを直接見ることができなくなります。

どうすれば両方の世界を最大限に活用できますか?IE:値の列にカスタム値があり、Visual Studioが魔法の豆を隠していないのですか?

4

3 に答える 3

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()

于 2009-07-08T23:26:00.480 に答える
2

MSDNの「 DebuggerDisplay属性の使用」の記事を確認した後、 DebuggerDisplay属性を使用するのではなく、代替オプションとしてクラスのToString()関数をオーバーライドできることが示唆されています。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; }
    }    
}
于 2009-07-08T22:01:04.177 に答える
0

次のようにDebuggerDisplay属性を使用します。

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

ここにいくつかの詳細情報。

于 2016-08-15T13:54:45.880 に答える