Domanda

Ho una classe che eredita da un List<MagicBean>.Funziona bene e come previsto in tutti gli aspetti tranne uno:quando ho aggiunto la [DebuggerDisplay] attributo.Anche se guardando la Lista ha come [DebuggerDisplay("Count = {Count}")], se ho così tanto come copia e incolla sul mio, ho perso la capacità di guardare direttamente a tutte le MagicBeans io sono senza fori nella base->soci privati durante il debug.

Come posso ottenere il meglio di entrambi i mondi?Vale a dire:Personalizzato valore nella colonna valore, e Visual Studio non nascondendo il mio fagioli magici da me?

È stato utile?

Soluzione

È possibile ottenere l'effetto che utilizzando il DebuggerTypeProxy attributo.È necessario creare una classe per fare un debug "visualizzazione" dei tuoi ereditato elenco:

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

Si può quindi dichiarare questa classe per essere utilizzato dal debugger per la visualizzazione di classe, insieme con il DebuggerDisplay attributo:

[DebuggerDisplay("Count = {Count}")]
[DebuggerTypeProxy(typeof(MagicBeanListDebugView))]
public class MagicBeanList : List<MagicBean>
{}

Questo vi darà il "Count = 3" messaggio quando si passa il cursore su un'istanza di ereditato elenco in Visual Studio, e la vista gli elementi nell'elenco quando si espande il nodo principale, senza dover scorrere le proprietà di base.

Utilizzando ToString() specificamente per ottenere l'output di debug non è un buon approccio, a meno che, naturalmente, si sono già override ToString() per l'utilizzo nel codice altrove, nel qual caso si può fare uso di esso.

Altri suggerimenti

Dopo aver visto l' "Utilizzando DebuggerDisplay Attributo"articolo su MSDN, essi suggeriscono che è possibile sovrascrivere ToString() della classe come opzione alternativa, piuttosto che utilizzando DebuggerDisplay attributo.L'override del metodo ToString() non riesce a nascondere i fagioli sia.

Se un oggetto di C# è un override ToString(), il debugger si chiama il ignorare e di mostrare il suo risultato invece di standard di {}. Quindi, se si è sottoposto a override di ToString(), è non è necessario utilizzare DebuggerDisplay. Se si utilizzano entrambi, il DebuggerDisplay attributo ha la precedenza su ToString() eseguire l'override.

Siete in grado di sovrascrivere il metodo ToString() della tua classe o utilizzare per altri scopi?

Non so se hai già considerato questo o no, ma ho pensato di suggerire solo in caso aiuta.:-)

Per completezza, in modo che chiunque altro può rapidamente mock up;ecco un rapido esempio che ho fatto:

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

Utilizzare il DebuggerDisplay attributo in questo modo:

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

Qualche info in più qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top