13

मुझे एक कक्षा मिली है जो List<MagicBean> से प्राप्त होती है। यह अच्छी तरह से काम करता है और जैसा कि किसी को छोड़कर सभी मामलों में अपेक्षित है: जब मैं [DebuggerDisplay] विशेषता जोड़ता हूं। हालांकि सूची में देखने के लिए यह [DebuggerDisplay("Count = {Count}")] है, अगर मैं अपनी प्रतिलिपि बनाने और पेस्ट करने के लिए इतना कुछ करता हूं, तो मैं डिबगिंग के दौरान बेस-> निजी सदस्यों में ड्रिल किए बिना मेरे सभी मैजिकबीन पर सीधे देखने की क्षमता खो देता हूं।[डीबगर डिस्प्ले] को विरासत में कक्षाओं का सम्मान कैसे करें या कम से कम संग्रह के साथ काम करें?

मैं दोनों दुनिया के सर्वश्रेष्ठ कैसे प्राप्त करूं? आईई: मूल्य कॉलम में कस्टम मान, और विजुअल स्टूडियो मेरे जादू सेम छुपा नहीं रहा है?

उत्तर

9

आप प्रभाव आप 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> 
{} 

यह आपको "काउंटर = 3" संदेश देगा जब आप विजुअल स्टूडियो में अपनी विरासत सूची के उदाहरण पर होवर करते हैं, और ड्रिल किए बिना रूट नोड का विस्तार करते समय सूची में आइटमों का एक दृश्य देखेंगे आधार गुणों में नीचे।

ToString() का उपयोग विशेष रूप से डिबग आउटपुट प्राप्त करने के लिए एक अच्छा दृष्टिकोण, जब तक कि बेशक आप पहले से ही कहीं और अपने कोड में उपयोग करते हैं, जिस स्थिति में आप यह का उपयोग कर सकते के लिए ToString() अधिभावी कर रहे हैं नहीं है।

+0

निफ्टी उपयोगी है, लेकिन सुंदर कॉपी और पेस्ट लगता है।मैं अभी परीक्षण नहीं कर सकता, लेकिन क्या कोई तरीका है कि मैं पहले से उपयोग की जाने वाली कोड सूची का उपयोग कर सकता हूं, या कम से कम एक सामान्य संस्करण लिखने में सक्षम हो सकता हूं? मैं इसे प्रत्येक कस्टम कंटेनर वर्ग के लिए टाइप करने से नफरत करता हूं। – MighMoS

+0

कुछ खुदाई के माध्यम से जाने के बाद, स्पष्ट रूप से जवाब नहीं है। – MighMoS

2

एमएसडीएन पर "Using DebuggerDisplay Attribute" आलेख को देखने के बाद, वे सुझाव देते हैं कि आप डीबगर डिस्प्ले विशेषता का उपयोग करने के बजाय वैकल्पिक विकल्प के रूप में अपनी कक्षा के ToString() फ़ंक्शन को ओवरराइड कर सकते हैं। ToString() विधि को ओवरराइड करने से आपकी बीन्स भी छिपी नहीं जाएंगी।

एक सी # वस्तु एक ओवरराइड toString() है, डिबगर ओवरराइड फोन और मानक {} के बजाय उसके परिणाम दिखाने होगा। इस प्रकार, यदि आपने ToString() को ओवरराइड किया है, तो आप को डीबगर डिस्प्ले का उपयोग नहीं करना है। यदि आप दोनों का उपयोग करते हैं, तो डीबगर डिस्प्ले विशेषता 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; } 
    }  
} 
0

उपयोग DebuggerDisplay तो जैसे गुण:

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

कुछ अधिक जानकारी here

संबंधित मुद्दे