2009-11-04 15 views
7

प्राप्त करें मेरे पास एक ऑब्जेक्ट है जिसमें बड़ी संख्या में गुण हैं। मैं ऑब्जेक्ट के गुण संग्रह के माध्यम से बस लूपिंग करके उन गुणों में से प्रत्येक का मान प्राप्त करना चाहता हूं।संपत्ति मूल्य गतिशील रूप से

मैंने PropertyInfo.GetValue() विधि में देखा है, हालांकि यह मेरे संदर्भ में ज्यादा समझ नहीं ले रहा है।

यहाँ मुझे क्या करना (इस कोड btw काम नहीं करता है) कोशिश कर रहा हूँ का एक उदाहरण है:

foreach(var item in dataObjects) 
    { 
    foreach(PropertyInfo prop in item.GetType().GetProperties()) 
    { 
     String value = prop.GetValue().ToString() 
    } 
    } 

मैं अब पता है कि एक संपत्ति के मूल्य में हो रही इस आसान नहीं है। मैं क्या खो रहा हूँ? मैं वास्तव में समझ नहीं पा रहा हूं कि मुझे GetValue() विधि को पास करने की आवश्यकता है क्योंकि मैं बस उस संपत्ति का मूल्य चाहता हूं जिसे मैं उस विधि को बुला रहा हूं।

मेरे लिए यह स्पष्ट करने में किसी भी मदद के लिए धन्यवाद। मैंने डेस्क के खिलाफ अपने सिर को टक्कर मारकर यहां कुछ घंटों बिताए हैं।

prop.GetValue(item, null); 

PropertyInfo बस प्रकार पर संपत्ति , विशिष्ट वस्तु दृष्टान्त पर नहीं के बारे में metatdata है:

+2

यह भी संकलित कैसे करता है? – Tinister

+2

यह नहीं करता है। यह एक उदाहरण है जिसे मैं "चाहता हूं" करना चाहता हूं, न कि वास्तव में कोड क्या करता है। :) –

उत्तर

10

आप विशिष्ट वस्तु हैं कि विवादित संपत्ति कॉल करना चाहते हैं, जिस पर प्रदान करने के लिए की जरूरत है। PropertyInfo यह नहीं जानता कि यह किस उदाहरण से आया (यदि कोई है) - बस उस प्रकार/वर्ग से आया था।

आप लगभग संपत्ति के नाम के रूप में PropertyInfo के बारे में सोच सकते हैं। यह अकेले इसके साथ कुछ भी करने के लिए पर्याप्त जानकारी नहीं है - हमें तब कहना है कि "इस नाम के साथ संपत्ति का मूल्य प्राप्त करें ... क्या?" ऑब्जेक्ट पर हम प्रदान करते हैं।

3

PropertyInfo संपत्ति मशीनरी खुद का प्रतिनिधित्व करता है (प्रकार, विधि, सेट विधि, वगैरह मिल), नहीं एक संपत्ति एक विशिष्ट उदाहरण के लिए बाध्य। अगर संपत्ति अस्थिर है, तो आपको उस संपत्ति को पढ़ने के लिए एक उदाहरण प्रदान करना होगा - यह GetValue का पहला पैरामीटर है। दूसरे शब्दों में, अगर pi एक PropertyInfo कुछ वर्ग और someObject पर Test संपत्ति का प्रतिनिधित्व करता है कि वर्ग का एक उदाहरण है:

object a = someObject.Test; 
object b = pi.GetValue(someObject, null); 

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

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