2010-05-08 10 views
5

का उपयोग करके किसी ऑब्जेक्ट को प्रस्तुत करने के लिए कोई विधि मौजूद है, मेरे पास डीबगर डिस्प्ले एट्रिब्यूट के साथ सजाए गए कई वर्ग हैं।क्या डीबगरडिस्प्ले एट्रिब्यूट

मैं यूनिट टेस्ट में ट्रेस स्टेटमेंट जोड़ने में सक्षम होना चाहता हूं जो इन वर्गों के उदाहरण प्रदर्शित करेगा।

क्या .NET Framework में कोई विधि मौजूद है जो डीबगर डिस्प्ले एट्रिब्यूट (या किसी भी डीबगर डिस्प्लेएट्रिब्यूट को परिभाषित नहीं किया गया है) का उपयोग करने के लिए वापस टॉगरिंग() का उपयोग करने के लिए स्वरूपित ऑब्जेक्ट प्रदर्शित करेगा।

संपादित

स्पष्ट करने के लिए, मैं वहाँ उम्मीद थी फ्रेमवर्क में निर्मित कुछ हो सकता है। मुझे पता है कि मैं डीबगर डिस्प्ले एट्रिब्यूट से वैल्यू प्रॉपर्टी प्राप्त कर सकता हूं, लेकिन मुझे डीबगर डीस्प्लेएट्रिब्यूट.वेल्यू द्वारा प्रतिनिधित्व प्रारूप स्ट्रिंग का उपयोग करके अपना उदाहरण प्रारूपित करने की आवश्यकता है।

तो मैं अपने खुद के रोल, मैं निम्नलिखित लाइनों के साथ एक विस्तार विधि की परिकल्पना चाहते हैं:

public string FormatDebugDisplay(this object value) 
{ 
    DebugDisplayAttribute attribute = ... get the attribute for value ... 
    if (attribute = null) return value.ToString(); 

    string formatString = attribute.Value; 

    ??? How do I format value using formatString ??? 
    return SomeFormatMethod(formatString, value); 
} 

उत्तर

2
:

public static string ToDebugString(this object obj) 
{ 
    var attribute = obj.GetType(). 
     GetCustomAttributes(typeof(DebuggerDisplayAttribute), false); 
    return (attribute == null) ? obj.ToString() : attribute.Value; 
} 

आप इसे हर वस्तु पर कॉल कर सकते हैं

यह अच्छा हो सकता है - लेकिन डीबगर डिस्प्ले एट्रिब्यूट की प्रारूप स्ट्रिंग का मूल्यांकन डीबगर द्वारा किया जाता है, वैसे ही यह आपके द्वारा वॉच विंडोज़ में टाइप किए गए अभिव्यक्तियों का मूल्यांकन करता है। तत्काल खिड़की यही कारण है कि आप {FirstName + " " + LastName} जैसे ब्रेसिज़ के अंदर मनमाने ढंग से अभिव्यक्ति डाल सकते हैं।

इसलिए, अपने कोड में इनका मूल्यांकन करने के लिए, आपको अपने ऐप में विजुअल स्टूडियो डीबगर एम्बेड करना होगा। शायद होने वाला नहीं है। (grin)

आपकी सर्वश्रेष्ठ शर्त संभवत: आपके डीबगर डिस्प्ले प्रारूप स्ट्रिंग में मौजूद सभी स्वरूपण तर्क लेने के लिए है, और इसके बजाय इसे एक विधि बनाएं। फिर आप उस कोड को अपने कोड से कॉल करने के लिए स्वतंत्र हैं। आपका डीबगर डिस्प्ले विशेषता कुछ भी नहीं कर रही है लेकिन विधि को बुला रही है।

[DebuggerDisplay("{Inspect()}")] 
public class MyClass { 
    public string Inspect() { ... } 
} 
+0

धन्यवाद। जिस तरह से आप वर्णन करने की कोशिश कर रहे थे, उसके उद्देश्य को हर तरह के तरीके से पराजित करने के तरीके में अपनी खुद की विधि लिखना। मैं प्रश्न में कक्षाओं के लिए ToString() ओवरराइड के साथ चला गया है। – Joe

+0

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

+0

आपको मूल्य प्रदान करने वाली विधि लिखने के लिए "अपने ऐप में विजुअल स्टूडियो डीबगर को एम्बेड करने" की आवश्यकता नहीं होगी। मुझे संदेह होगा कि डीबगर डिस्प्ले के _most_ उपयोग सरल संपत्ति मान हैं, और यह लागू करना एक मूल्यवान तरीका होगा। –

1

DebuggerDisplayAttribute एक Value संपत्ति जो रिटर्न आप क्या चाहते है।

तो आप शायद कुछ इस तरह इस्तेमाल कर सकते हैं:

var attribute = obj.GetType(). 
    GetCustomAttributes(typeof(DebuggerDisplayAttribute), false); 
return (attribute == null) ? obj.ToString() : attribute.Value; 

तुम भी एक विस्तार विधि में इस डाल सकता है: myObject.ToDebugString()

+1

हाँ, मुझे पता है कि मैं अपना खुद का रोल कर सकता हूं, सवाल यह था कि कुछ भी पहले से मौजूद है या नहीं। आपका नमूना मदद नहीं करता है - यह प्रारूप स्ट्रिंग का उपयोग करके ओबीजे को स्वरूपित करने के बजाय विशेषता के स्वरूप स्ट्रिंग को प्रदर्शित करेगा। – Joe

0

इस विधि को लागू नहीं होगा कि वास्तव में क्या DebuggerDisplayAttribute डीबगर में प्रदान करता है, लेकिन यह क्या मैं अपने कोड में उपयोग किया गया है है। इसमें हमारे कोडबेस में अनुभव होने वाले मामलों में से लगभग 9 0% (या अधिक) शामिल हैं। यदि आप इसे और भी अधिक मामलों को कवर करने के लिए इसे ठीक करते हैं, तो मुझे आपके संवर्द्धन देखना अच्छा लगेगा!

public static string ToDebuggerString(this object @this) 
    { 
     var display = @this.GetType().GetCustomAttributes(typeof (DebuggerDisplayAttribute),false).FirstOrDefault() as DebuggerDisplayAttribute; 
     if (display == null) 
      return @this.ToString(); 

     var format = display.Value; 
     var builder = new StringBuilder(); 
     for (var index = 0; index < format.Length; index++) 
     { 
      if (format[index] == '{') 
      { 
       var close = format.IndexOf('}', index); 
       if (close > index) 
       { 
        index++; 
        var name = format.Substring(index, close - index); 
        var property = @this.GetType().GetProperty(name); 
        if (property != null) 
        { 
         var value = property.GetValue(@this, null).ToString(); 
         builder.Append(value); 
         index += name.Length; 
        } 
       } 
      } 
      else 
       builder.Append(format[index]); 
     } 
     return builder.ToString(); 
    } 
संबंधित मुद्दे