2013-12-17 9 views
24

एक वर्ग PCLDebug साथ मैं एक पोर्टेबल कक्षा लाइब्रेरी है:एक प्रतिनिधि बनाएं जब वहाँ एक सशर्त विशेषता

public static class PCLDebug { 
    public static Action<string> LogLine { get; set; } 
} 

मुझे क्या करना बाहरी परियोजना में चीजों की स्थापना की है एक बार चाहते हैं, तो फोन करने में सक्षम हो वीएस आउटपुट विंडो में सामान प्रिंट करने के लिए पीसीएल के भीतर LogLine। यहाँ मेरी प्रयास है:

MyPCL.PCLDebug.LogLine = System.Diagnostics.Debug.WriteLine; 

समस्या है कि यहाँ संकलक शिकायत करता है, क्योंकि System.Diagnostics.Debug.WriteLine डीबग की एक सशर्त विशेषता है:

'System.Diagnostics के साथ प्रतिनिधि नहीं बनाया जा सकता .Debug.WriteLine (स्ट्रिंग) 'क्योंकि यह एक सशर्त विशेषता

है मैं वास्तव में इसके साथ ठीक हूँ अगर LogLine कॉल केवल डिबगिंग वातावरण में काम करता है। लेकिन मैं कंपाइलर को खुश कैसे रखूं?

उत्तर

41

आप एक लैम्ब्डा समारोह में यह लपेटकर कोशिश कर सकते:

MyPCL.PCLDebug.LogLine = s => { System.Diagnostics.Debug.WriteLine(s); }; 
+0

यह मेरे लिए काम किया। धन्यवाद! – realPT

+0

यह क्यों काम करता है लेकिन यह सीधे असाइन करने में काम नहीं करता है? – reggaeguitar

+4

@reggaeguitar क्योंकि 'सशर्त एट्रिब्यूट' कंपाइलर को फ़ंक्शन पर कॉल छोड़ने का कारण बनता है, लेकिन प्रत्यक्ष असाइनमेंट कॉल नहीं है, यह वास्तव में प्रतिनिधि निर्माण है, इसलिए इसे छोड़ा नहीं जा सकता है। लैम्ब्डा काम करता है क्योंकि यह एक अज्ञात फ़ंक्शन बनाता है जो या तो कुछ भी नहीं करता है या सशर्त फ़ंक्शन को कॉल करता है। किसी भी मामले में प्रतिनिधि निश्चित रूप से असाइन किया जाता है। – Kyle

3

आप उपयोगकर्ता इस विकल्प अंकन भी कर सकते हैं:

MyPCL.PCLDebug.LogLine = delegate(string text) { System.Diagnostics.Debug.WriteLine(text); }; 
संबंधित मुद्दे