6

विशेषता [डीबगर डिस्प्ले] (Using DebuggerDisplayAttribute) वीएस 2010/2008 के डीबगर में डिस्प्ले को परिभाषित करने की अनुमति देता है। AutoExp.cs/.dll को संशोधित करके, मैं सिस्टम प्रकारों और तृतीय पक्ष प्रकारों के प्रदर्शन को ओवरराइड भी कर सकता हूं, उदा।[डीबगर डिस्प्ले] विशेषता विस्तार विधियों का उपयोग

[assembly: DebuggerDisplay (@"\{Name = {Name} FullName = {FullName}}", Target = typeof (Type))] 

आंतरिक घुंघराले ब्रेसिज़ में मैं फ़ील्ड, गुणों और विधियों का संदर्भ दे सकता हूं। क्या विस्तार विधियों का संदर्भ देना संभव है?

उदाहरण के तौर पर, मैंने छोटे प्रकार के नाम प्रदर्शित करने की कोशिश की, उदा। के बजाय $SCG.Dictionary। मैं AutoExp.cs को यह कहा:

using DbgDisp; 

[assembly: DebuggerDisplay (@"\{Name = {Name} ShortName = {ShortName()}}", Target = typeof (Type))] 

namespace DbgDisp { 
    public static class Ext { 
    public static string ShortName (this Type t) { return string.Format ("[{0}]", t.Name); } 
    } // Ext 
} // DbgDisp 

लेकिन डिबगर शिकायत: नाम 'SHORTNAME' वर्तमान संदर्भ में मौजूद नहीं है।

क्या मुझे कुछ याद आ रहा है, या क्या वहां एक्सटेंशन विधियों का उपयोग करना संभव नहीं है?

मुझे पता है कि मैं ToString() ओवरराइड कर सकता हूं, लेकिन यह केवल मेरे अपने प्रकार के लिए मदद करता है।

+0

, के रूप में यह गुजर डिबग प्रदर्शन के संदर्भ में अपने खुद के कोड को निष्पादित करने के कुछ स्मार्ट दूसरी तरह के तरीकों वास्तव में आप उपयोग कर सकते हैं दिलचस्प है, भी :) होगा – MillKa

+0

इससे मुझे बनाने डिबगिंग के लिए एक कस्टम प्रदर्शन स्ट्रिंग। एक मुहरबंद वर्ग के लिए एक विस्तार का उपयोग कर संभव था। seesharpers उत्तर को प्रति साइट नीति के स्वीकृत उत्तर के रूप में चिह्नित किया जाना चाहिए: http://meta.stackexchange.com/questions/62252/is-it-poor-form-to-switch-accepted-answers – Taterhead

उत्तर

4

संक्षेप में, नहीं। इसी कारण से एक्सटेंशन विधियां dynamic के साथ काम नहीं करती हैं, जो कि से विधि का नाम है, using निर्देशों के प्रभावी होने के बारे में जानने का कोई तरीका नहीं है, और इसलिए कौन से एक्सटेंशन विधियां उम्मीदवार हैं। परिदृश्यों के लिए पूरी तरह से संभव है जहां विभिन्न using निर्देशों का उपयोग उपलब्ध विधियों को बदलता है, इसलिए अनुमान लगाने का प्रयास करने में कोई फायदा नहीं होता है।

आपको नियमित तरीकों से खुद को सीमित करना होगा, जब तक कि स्ट्रिंग आपको कक्षाओं पर स्पष्ट तरीके से निर्दिष्ट करने की अनुमति न दे, यानी DbgDisp.Ext.ShortName(foo)

+0

धन्यवाद, मार्क। नहीं, स्पष्ट विधि नाम 'DbgDisp.Ext.ShortName' या तो काम नहीं करता है। मैंने सोचा कि एक विस्तार विधि के साथ प्रकार में घुसपैठ करना स्मार्ट था, लेकिन जब ऑटोएक्सपी संकलित किया गया था, तो यह केवल स्ट्रिंग अक्षर की प्रतिलिपि बनाता है। मुझे लगता है कि बाद में, डीबग समय पर, स्ट्रिंग अक्षर का मूल्यांकन किया जाता है और फिर डीबगर विधि ('type.GetMethods()') खोजने के लिए प्रतिबिंब का उपयोग करता है। यदि यह प्रकार के बाहर नहीं दिखता है, तो यह मेरी विधि नहीं ढूंढ सकता है। तो मुझे लगता है कि त्रुटि संदेश में उल्लिखित संदर्भ ही प्रकार है। – MillKa

+1

हालांकि, ऑटोएक्सपी में तीसरे पक्ष और सिस्टम प्रकारों को 'डीबगर टाइप टाइपोक्सी' विशेषताओं को जोड़ना संभव है, लेकिन यह किसी अन्य समस्या का समाधान हो सकता है :) – MillKa

0

आप अपनी कक्षा में एक निजी विधि डाल सकते हैं जो स्ट्रिंग जेनरेट करने के लिए इच्छित एक्सटेंशन विधि का उपयोग करती है। DebuggerDisplay विशेषता तब उस विधि का संदर्भ दे सकती है।

3

विस्तार तर्क

[assembly: DebuggerDisplay(@"NetGuid = {ToString()} OracleGuid = {GuidExtensions.ToVarChar(this)}", Target = typeof(Guid))] 
public static class GuidExtensions 
{ 
    public static string ToVarChar(this Guid guid) 
    { 
     var newBytes = new byte[16]; 
     var oldBytes = guid.ToByteArray(); 
     for (var i = 8; i < 16; i++) 
      newBytes[i] = oldBytes[i]; 

     newBytes[3] = oldBytes[0]; 
     newBytes[2] = oldBytes[1]; 
     newBytes[1] = oldBytes[2]; 
     newBytes[0] = oldBytes[3]; 
     newBytes[5] = oldBytes[4]; 
     newBytes[4] = oldBytes[5]; 
     newBytes[6] = oldBytes[7]; 
     newBytes[7] = oldBytes[6]; 

     return new Guid(newBytes).ToString("N").ToUpper(); 
    }  
} 
बेशक