2008-09-24 15 views

उत्तर

63

विशेषताएं स्थिर मेटाडेटा हैं। असेंब्ली, मॉड्यूल, प्रकार, सदस्य, पैरामीटर, और वापसी मान सी # में प्रथम श्रेणी की वस्तुएं नहीं हैं (उदा।, System.Type कक्षा केवल एक प्रकार का एक प्रतिबिंबित प्रतिनिधित्व है)। आप एक प्रकार के लिए एक विशेषता का उदाहरण प्राप्त कर सकते हैं और गुणों को बदल सकते हैं यदि वे लिखने योग्य हैं लेकिन इससे विशेषता पर प्रभाव नहीं पड़ेगा क्योंकि यह प्रकार पर लागू होता है।

3

मुझे विश्वास नहीं है। यहां तक ​​कि यदि मैं गलत हूं, तो आप उम्मीद कर सकते हैं कि आप उन्हें एक संपूर्ण प्रकार में जोड़ रहे हैं, कभी भी उदाहरण किसी प्रकार का नहीं।

+21

TypeDescriptor.AddAttributes (ऑब्जेक्ट, विशेषता []) लक्ष्य घटक उदाहरण में कक्षा-स्तर विशेषताओं को जोड़ता है। –

4

नहीं, ऐसा नहीं है।

गुण मेटा-डेटा हैं और संकलित असेंबली में बाइनरी-फॉर्म में संग्रहीत हैं (यही कारण है कि आप केवल उनमें सरल प्रकार का उपयोग कर सकते हैं)।

9

आप नहीं कर सकते। रनटाइम पर व्युत्पन्न कक्षा उत्पन्न करने और विशेषता जोड़ने के लिए एक वर्कअराउंड हो सकता है, हालांकि यह संभवतः एक ओवरकिल का थोड़ा सा है।

3

यदि आपको कुछ गतिशील रूप से जोड़ने में सक्षम होने की आवश्यकता है, तो सी # विशेषताएँ नहीं हैं। एक्सएमएल में डेटा भंडारण में देखो। मैंने हाल ही में एक प्रोजेक्ट किया है जिसे मैंने w/विशेषताएं शुरू की हैं, लेकिन अंत में क्रमबद्धता w/xml में स्थानांतरित हो गईं।

3

आपको क्यों आवश्यकता है? गुण प्रतिबिंब के लिए अतिरिक्त जानकारी देते हैं, लेकिन यदि आप बाहरी रूप से जानते हैं कि आप कौन सी संपत्ति चाहते हैं तो आपको उनकी आवश्यकता नहीं है।

आप डेटाबेस या संसाधन फ़ाइल में बाहरी रूप से आसानी से मेटा डेटा स्टोर कर सकते हैं।

+1

बॉयलरप्लेट उन्मूलन। यदि आप क्लास के भीतर कोड के आधार पर स्वचालित रूप से गुण उत्पन्न कर सकते हैं तो यह आसान नहीं होगा? मैं एसक्यूएल सीएलआर ऑब्जेक्ट्स में बॉयलरप्लेट को कम करने के लिए इस तरह कुछ समझने की कोशिश कर रहा हूं। अन्य भाषाओं में आसान होगा ... देखें http://www.paulgraham.com/avg.html –

65

यह वास्तव में इस बात पर निर्भर करता है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं।

System.ComponentModel.TypeDescriptor सामान प्रकार, गुणों और ऑब्जेक्ट उदाहरणों में विशेषताओं को जोड़ने के लिए उपयोग किया जा सकता है, और इसमें सीमाएं हैं जिन्हें आप उन गुणों को पुनर्प्राप्त करने के लिए भी उपयोग कर सकते हैं। यदि आप उन गुणों का उपभोग करने वाले कोड को लिख रहे हैं, और आप उन सीमाओं के भीतर रह सकते हैं, तो मैं निश्चित रूप से इसका सुझाव दूंगा।

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

+5

दरअसल, अधिकांश डेटा-बाध्यकारी 'टाइपडिस्क्रिप्टर' का उपयोग करता है - न केवल 'PropertyGrid'। –

+1

सिल्वरलाइट प्रोजेक्ट में संपत्ति-मेटाडेटा विशेषताओं को जोड़ने के लिए कोई कामकाज (जहां 'टाइपडिस्क्रिप्टर' और 'टाइप डिस्क्रिप्शनप्रोवाइडर' लागू नहीं किए गए हैं? – Shimmy

+0

ध्यान देने योग्य है, TypeDescriptor.GetAttributes() डुप्लिकेट विशेषताओं को संभाल नहीं करता है। यह केवल अंतिम का चयन करता है विशेषता प्रकार। पूर्व '[Attr (1), Attr (2), Attr (3)] 'केवल' Attr (3)' पाया जाता है। – ohmusama

10

ठीक है, बस अलग होने के लिए, मुझे एक लेख मिला जो प्रतिबिंब का उपयोग कर संदर्भ देता है। ऐसा करने के लिए स्वीकार करें।

यहां लिंक है: http://www.codeproject.com/KB/cs/dotnetattributes.aspx, आप लेख के निचले भाग में कुछ टिप्पणियां भी देखना चाहेंगे, क्योंकि संभावित दृष्टिकोण पर चर्चा की जा रही है।

+9

ध्यान दें कि आप प्रतिबिंब के साथ रनटाइम पर विशेषताओं को बना सकते हैं। कक्षाएं दें, लेकिन आप उन्हें एमिट पैकेज के साथ बनाए गए वर्गों में बाध्य कर सकते हैं, न कि मौजूदा लोगों के लिए। – Panos

+0

यह अभी भी एक अच्छी अंतर्दृष्टि है। –

-6

जावा में मैं मानचित्र का उपयोग करके और कुंजी-मूल्य कोडिंग पर अपना स्वयं का कार्य लागू करके इस पर काम करता था।

http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html

+1

लिंक टूटा हुआ है, कृपया अपना उत्तर हटाएं – reggaeguitar

0

मैं सफलता के बिना System.ComponentModel.TypeDescriptor साथ बहुत मेहनत की कोशिश की। इसका मतलब यह नहीं है कि यह काम नहीं कर सकता है लेकिन मैं इसके लिए कोड देखना चाहता हूं।

काउंटर भाग में, मैं कुछ विशेषता मान बदलना चाहता था। मैंने 2 फ़ंक्शन किए जो उस उद्देश्य के लिए ठीक काम करते हैं।

 // ************************************************************************ 
     public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description) 
     { 
      PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName]; 
      var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute; 
      if (att != null) 
      { 
       var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance); 
       if (fieldDescription != null) 
       { 
        fieldDescription.SetValue(att, description); 
       } 
      } 
     } 

     // ************************************************************************ 
     public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly) 
     { 
      PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName]; 
      var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute; 
      if (att != null) 
      { 
       var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 
       if (fieldDescription != null) 
       { 
        fieldDescription.SetValue(att, isReadOnly); 
       } 
      } 
     } 
संबंधित मुद्दे