2010-05-04 18 views
12

मेरे पास निम्नलिखित डमी क्लास संरचना है और मैं यह जानने का प्रयास कर रहा हूं कि पीपुल्सलिस्ट में कक्षा के प्रत्येक उदाहरण से गुण कैसे प्राप्त करें। मुझे पता है कि लोगों के एक उदाहरण से गुण कैसे प्राप्त करें, लेकिन मेरे जीवन के लिए यह नहीं पता कि पीपुल्सलिस्ट से इसे कैसे प्राप्त किया जाए। मुझे यकीन है कि यह वास्तव में सीधा है लेकिन क्या कोई मुझे सही दिशा में इंगित कर सकता है?सी # प्रतिबिंब और गुण प्राप्त करना

public class Example 
{ 
    public class People 
    { 
     private string _name; 
     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 

     private int _age; 
     public int Age 
     { 
      get { return _age; } 
      set { _age = value; } 
     } 

     public People() 
     { 

     } 

     public People(string name, int age) 
     { 
      this._name = name; 
      this._age = age; 
     } 
    } 

    public class PeopleList : List<People> 
    { 
     public static void DoStuff() 
     { 
      PeopleList newList = new PeopleList(); 

      // Do some stuff 

      newList.Add(new People("Tim", 35)); 
     } 
    }   
} 
+1

इस पोस्ट को देखें: http://stackoverflow.com/questions/862783/setting-properties-of-an-object-through-reflection-with-different-properties-type – jjxtra

+0

आपका क्या मतलब है कि आप नहीं कर सकते उन्हें 'पीपुल्सलिस्ट' से प्राप्त करें? मानक 'गणना' और 'क्षमता 'के अलावा आपके उदाहरण में कोई गुण नहीं हैं ... –

+0

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

उत्तर

26

फिर भी नहीं 100% आप क्या चाहते हैं के बारे में सुनिश्चित है, लेकिन कोड (untested) सही रास्ते पर आपको मिल सकता है की इस त्वरित बिट (या कम से कम स्पष्ट तुम क्या चाहते मदद)।

void ReportValue(String propName, Object propValue); 

void ReadList<T>(List<T> list) 
{ 
    var props = typeof(T).GetProperties(); 
    foreach(T item in list) 
    { 
    foreach(var prop in props) 
    { 
     ReportValue(prop.Name, prop.GetValue(item)); 
    } 
    } 
} 

C# कि 'सूची' से 'PeopleList' inherits बाहर काम करते हैं और वह ठीक संभाल करने में सक्षम होना चाहिए, लेकिन अगर आप सामान्य प्रकार के रूप में 'PeopleList' की आवश्यकता है, तो यह काम करना चाहिए:

void ReadList<T>(T list) where T : System.Collections.IList 
{ 
    foreach (Object item in list) 
    { 
    var props = item.GetType().GetProperties(); 
    foreach (var prop in props) 
    { 
     ReportValue(prop.Name, prop.GetValue(item, null)); 
    } 
    } 
} 

ध्यान दें कि यह वास्तव में सूची के भीतर व्युत्पन्न प्रकारों में गुणों को संसाधित करेगा।

+0

यह लगभग वही है जो मैंने करने पर किया था। हालांकि, आप इसके बारे में कैसे जाएंगे (सूची सूची) (टी ओबीजे) थी जहां टी लोग हैं? या यह जाने का रास्ता नहीं है? क्या यह उपयोग करना बेहतर है (सूची सूची)? यही वह है जिसके साथ मैं संघर्ष कर रहा हूं। – Nathan

+0

@ नाथन - आप केवल 'आईन्यूमेरेबल ' का उपयोग कर सकते हैं, क्योंकि मैं * अनुमान लगा रहा हूं कि 'पीपुल्सलिस्ट' 'IEnumerable ' है। –

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