2010-05-24 13 views
6

वहाँ एक वर्ग या इंटरफ़ेस कार्यान्वयन पर कुछ विशेषताओं के लिए एक संकलन आवश्यकता लागू करने के लिए कोई तरीका है?मुझे क्लास परिभाषा पर एक विशेषता की आवश्यकता कैसे हो सकती है?

उदाहरण के लिए, मान लीजिए कि अपने आवेदन स्थिर कक्षाओं कि const int संसाधन मान होने की एक श्रृंखला का उपयोग करता हैं। मैं अपनी सामग्री का वर्णन करने के लिए Description विशेषता में कक्षा को सजाना चाहता हूं। अवधारणा में, मैं इस विशेषता आवश्यकता को एक इंटरफ़ेस पर लागू करना चाहता हूं, फिर प्रत्येक स्थैतिक वर्ग इसे इसके आवश्यक Description के साथ कार्यान्वित करेगी। अनुपालन की जांच के लिए मैं एक रन-टाइम चेक या यूनिट टेस्ट लिख सकता था। लेकिन वास्तव में एक संकलन समय की जांच सबसे अच्छी होगी।

क्या ऐसी कोई बात है?

उत्तर

6

नहीं, ऐसा कुछ नहीं है। जहां तक ​​मुझे पता है, यूनिट परीक्षण सबसे अच्छा कर सकते हैं।

आप स्वचालित रूप से वर्गों (नाम से, या किसी अन्य विशेषता यह है कि वर्ग के साथ सजाया गया है) की पहचान कर सकते हैं तो आप आसानी से एक सभा में सभी वर्गों के लिए एक इकाई परीक्षण लिख सकते हैं।

+0

+1 मैं दूसरी इकाई-परीक्षण, लिखने के लिए आसान है और हालांकि यह नहीं होगा संकलक शिकायत करें, यह आपको जानकारी खोने के लिए जल्दी ही सतर्क करेगा। –

1

यह प्रतिबिंब के माध्यम से क्रम में संभव है।

... 
using System.Reflection; 
using System.Diagnostics; 
using System.Linq; 
... 

[TestMethod] 
public void CheckAttributes() 
{ 
    var notAttributed = Assembly.GetAssembly(typeof(SomeClass)) 
     .GetTypes() 
     .Where(t => t.GetCustomAttributes(typeof(MyAttribute), true).Count() == 0); 

    Assert.AreEqual<int>(0, notAttributed.Count()); 
} 

कहाँ MyAttribute अपनी विशेषता के प्रकार है, और SomeClass विधानसभा आप जाँच करना चाहते हैं में एक वर्ग है:

यहाँ आप के लिए एक इकाई परीक्षण विधि है।
तुम भी प्रकार आप इस तरह से जाँच करना चाहते हैं फिल्टर करने के लिए कर सकते हैं। उस पर एक Conditional("DEBUG") विशेषता यह सुनिश्चित करें कि बनाने के लिए (केवल अगर आप हर वर्ग एक सभा में, कि विशेषता का उपयोग करने की आवश्यकता होती है निश्चित रूप से नहीं है।)


आप उत्पादन कोड में यह करने के लिए चाहते हैं, जगह यह केवल DEBUG मोड में निष्पादित किया जाता है।
(क्योंकि प्रतिबिंब तेजी से नहीं है, और यह वास्तव में भावना उत्पादन मोड में इस चलाने के लिए नहीं है, यह करता है?) उस के लिए

+0

उत्पादन कोड के खिलाफ * आपके * यूनिट परीक्षण * में इसे चलाने के लिए यह समझ में आता है। आप इसे सशर्त क्यों बनायेंगे और परीक्षण को अपने उत्पादन कोड में डाल देंगे? –

+0

@ जोन - मैंने इसे संपादित किया, अब यह एक यूनिट परीक्षण है। क्या अब यह समझ में आता है? : पी – Venemo

+0

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

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

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