2008-12-24 10 views
18

मैं एक कक्षाएं संपत्ति पर एक विशेषता है जो एक आपूर्ति डेटा पंक्ति में एक कॉलम संपत्ति का मूल्य है कि, जैसा कि नीचे निर्दिष्ट करता है के माध्यम से एक वस्तु का निर्माण करने की कोशिश कर रहा हूँ:सी # विशेषताओं के साथ प्रतिबिंब के माध्यम से संपत्ति मूल्यों की स्थापना

[StoredDataValue("guid")] 
    public string Guid { get; protected set; } 

    [StoredDataValue("PrograGuid")] 
    public string ProgramGuid { get; protected set; } 

एक आधार वस्तु पर एक बिल्ड() विधि में, मैं

 MemberInfo info = GetType(); 
     object[] properties = info.GetCustomAttributes(true); 

हालांकि के रूप में विशेषता मान इन गुणों पर सेट हो रही है, इस बिंदु पर मैं अपने ज्ञान में सीमा को साकार कर रहा हूँ।

शुरुआत के लिए, मुझे सही विशेषताओं को वापस नहीं मिल रहा है।

और मैं इन गुणों को प्रतिबिंब के माध्यम से कैसे सेट करूं, अब मेरे पास विशेषताएं हैं? क्या मैं कुछ मौलिक रूप से गलत कर रहा/सोच रहा हूं?

उत्तर

38

अलग मुद्दों की एक जोड़ी यहाँ

  • typeof(MyClass).GetCustomAttributes(bool) (या GetType().GetCustomAttributes(bool)) वर्ग ही है, नहीं के सदस्यों पर विशेषताओं पर गुण देता हैं। कक्षा में संपत्तियों की एक सूची प्राप्त करने के लिए आपको typeof(MyClass).GetProperties() का आह्वान करना होगा, और फिर उनमें से प्रत्येक को जांचें।

  • एक बार जब आपको संपत्ति मिल जाए, तो मुझे लगता है कि आपको का उपयोग MemberInfo.GetGustomAttributes() के बजाय करना चाहिए क्योंकि आप वास्तव में जानते हैं कि आप किस विशेषता को खोज रहे हैं।

यहाँ मदद करने के लिए आप शुरू एक छोटे से कोड का टुकड़ा है:

PropertyInfo[] properties = typeof(MyClass).GetProperties(); 
foreach(PropertyInfo property in properties) 
{ 
    StoredDataValueAttribute attribute = 
     Attribute.GetCustomAttribute(property, typeof(StoredDataValueAttribute)) as StoredDataValueAttribute; 

    if (attribute != null) // This property has a StoredDataValueAttribute 
    { 
     property.SetValue(instanceOfMyClass, attribute.DataValue, null); // null means no indexes 
    } 
} 

संपादित: मत भूलना कि Type.GetProperties() केवल डिफ़ॉल्ट रूप से सार्वजनिक गुण देता है। अन्य प्रकार के गुणों को पाने के लिए आपको Type.GetProperties(BindingFlags) का उपयोग करना होगा।

+0

मैं इसे एक परीक्षण दूंगा और आपको बता दूंगा, – johnc

+0

विशेषता के रूप में तार्किक लग रहा है। GETCustomAttribute (...) सिस्टम की एक सरणी देता है। एट्रिब्यूट और इसे केवल विशेषता में ही नहीं डाला जा सकता है। दिखाया गया उदाहरण भी अकेले काम करने के लिए संकलित नहीं करता है। यह देखने के लिए कि सरणी की लंबाई मौजूद है या नहीं, इसके बजाय आवश्यक तत्व में पहला तत्व डालें। –

+0

उदाहरण GetCustomAttribute का उपयोग करता है, GetCustomAttributes नहीं। उदाहरण जब मैं कोशिश करता हूं संकलित करता है (बेशक, विशेषता नाम बदलना)। –

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