2011-01-31 14 views
15

यह है वैध (यानी यह संकलित करता है तथा चलाता है।) एक वर्ग या एक विधि के लिए सामान्य पैरामीटर पर एक विशेषता डाल करने के लिए:जेनेरिक पैरामीटर पर विशेषताओं का क्या उपयोग है?

public class MyClass<[My] T> 
{ 
    private void MyMethod<[My] T>() 
    {} 
} 

public class MyAttribute : Attribute 
{} 

मैं इस प्रयोग किया जाता है कभी नहीं देखा है, और के साथ आने के लिए संघर्ष कर रहा हूँ एक कारण है कि आप क्यों करना चाहते हैं।

यह सिर्फ एक मोड़/भाषा विनिर्देश के पक्ष प्रभाव है, या वहाँ एक वैध/उपयोगी इस स्थिति में एक विशेषता डाल करने के लिए कारण क्या है?

+6

उन सामान्य _parameters_, नहीं बाधाओं रहे हैं। – SLaks

+4

मुझे नहीं पता था कि जेनेरिक पैरामीटर के लिए विशेषताओं को लागू करना संभव था। कूल :) –

+0

मैंने इसे कभी नहीं देखा है - यह बहुत दिलचस्प है धन्यवाद! अब अगर मैं वास्तव में उपयोग कर सकता हूं ... संपादित करें: आप किसी भी प्रकार की विधि के लिए पैरामीटर पर विशेषताओं का उपयोग कर सकते हैं - न केवल सामान्य। यह मेरा दिमाग उड़ा रहा है। – RichK

उत्तर

13

इसी कारण विशेषताओं के लिए किसी भी निर्माण पर उपयोगी होते हैं; वे मेटा-डेटा की आपूर्ति करते हैं जिसका उपयोग प्रतिबिंब या अन्य पोस्ट प्रोसेसर द्वारा विभिन्न चीजों को करने के लिए किया जा सकता है। उदाहरण के लिए, यदि आप एक AOP प्रणाली एक प्रकार तर्क पर एक विशेषता का उपयोग करता है कुछ रन-टाइम की कमी है कि अन्यथा व्यक्त नहीं किया जा सकता है लागू करने के लिए हो सकता है। मुझे यकीन नहीं है कि क्या ऐसी कोई प्रणाली है जो वास्तव में कुछ भी करने के लिए इन विशेषताओं का उपयोग करती है, लेकिन मेटाडेटा के रूप में उन्हें अस्वीकार करने का कोई कारण नहीं है।

+0

मैंने प्रतिबिंब के मामले के बारे में सोचा था क्योंकि मैं एक आवेदन में कक्षाओं को चिह्नित करने के लिए एक ही दृष्टिकोण का उपयोग करता हूं, लेकिन मुझे अभी भी इस विशेष सुविधा के लिए एक परिदृश्य के बारे में सोचने के लिए संघर्ष करना पड़ा। – adrianbanks

+3

एड्रियनबैंक: दान का जवाब सटीक है। मिसाल के तौर पर, मैंने एक बार एक उपकरण लिखा था जो सी # सीमा को दूर करने के लिए अपनी बाधा को बदलने के लिए एक [डीमेटेट कॉन्स्ट्रेन] के साथ या [EnumConstraint] के साथ एक सामान्य पैरामीटर को संसाधित करता है। –

+0

@ जेबी इवान: मैंने पहले भी वही किया था! जबरदस्त हंसी। –

1

मुझे यकीन है कि कुछ AOP अखरोट विशेषताओं के साथ सामान्य मापदंडों को सजाने के लिए एक वैध कारण मिल जाएगा हूँ। मैं निश्चित रूप से किसी के बारे में नहीं सोच सकता। इस प्रयास करें:

typeof(MyClass<>).GetGenericArguments().GetCustomAttributes().OfType<MyAttribute>(); 

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

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