2008-10-26 16 views
13

मैं एक ऐरेलिस्ट (संभावित रूप से वस्तुओं से भरा) लेने के लिए एक विधि का निर्माण कर रहा हूं और फिर ArrayList में प्रत्येक ऑब्जेक्ट के लिए सभी फ़ील्ड (और उनके मान) सूचीबद्ध करता हूं।मैं सी # में ऑब्जेक्ट के सभी सार्वजनिक फ़ील्ड कैसे ढूंढ सकता हूं?

वर्तमान में मेरे कोड इस प्रकार है:

public static void ListArrayListMembers(ArrayList list) 
    { 
     foreach (Object obj in list) 
     { 
      Type type = obj.GetType(); 
      string field = type.GetFields().ToString(); 
      Console.WriteLine(field); 

     } 
    } 
बेशक

, मैं इस कोड के साथ तत्काल मुद्दे को समझने: अगर यह काम किया यह केवल ArrayList में वस्तु प्रति एक क्षेत्र प्रिंट चाहते हैं। मैं इसे बाद में ठीक कर दूंगा - अभी मैं उत्सुक हूं कि ऑब्जेक्ट से जुड़े सभी सार्वजनिक फ़ील्ड कैसे प्राप्त करें।

संपादित करें: फ्लिप-फ्लॉपिंग उत्तरों के लिए क्षमा करें। मुझे जवाब चुनने से पहले हर विधि की कोशिश करनी चाहिए थी।

+0

आपका कोड यह प्रिंट करेगा: सिस्टम। रिफ्लेक्शन। फ़ील्डइन्फो [] –

उत्तर

21
foreach (Object obj in list) { 
    Type type = obj.GetType(); 

    foreach (var f in type.GetFields().Where(f => f.IsPublic)) { 
     Console.WriteLine(
      String.Format("Name: {0} Value: {1}", f.Name, f.GetValue(obj)); 
    }       
} 

ध्यान दें कि यह कोड मुझे लगता है कि क्षेत्र में IsPublic की तलाश में type.GetFields के रूप में आवश्यक नहीं है उल्लेख करना चाहते हैं ;-)

+0

कभी नहीं। मुझे यह तकनीक बेहतर पसंद है। मैं गुणों (और यहां तक ​​कि विधियों) को पाने के लिए बस इसे बाहर निकाला जा सकता हूं। बहुत बहुत धन्यवाद! – junkforce

+1

Thx। जहां स्थिति डेव के लिए Thx .. मुझे पता है कि यह 10 साल बाद है, लेकिन मुझे यह पसंद है। सीधे .. केवल प्रकाशन .. गेटर्स के लिए कोई ज़रूरत नहीं है .. और चिंता न करें यह अभी भी वीएस 2017 में सी # के साथ काम करता है। नेट 4.6.2 और कोर: पी – Goodies

4
public static void ListArrayListMembers(ArrayList list) 
{ 
    foreach (Object obj in list) 
    { 
     Type type = obj.GetType(); 
     Console.WriteLine("{0} -- ", type.Name); 
     Console.WriteLine(" Properties: "); 
     foreach (PropertyInfo prop in type.GetProperties()) 
     { 
      Console.WriteLine("\t{0} {1} = {2}", prop.PropertyType.Name, 
       prop.Name, prop.GetValue(obj, null)); 
     } 
     Console.WriteLine(" Fields: "); 
     foreach (FieldInfo field in type.GetFields()) 
     { 
      Console.WriteLine("\t{0} {1} = {2}", field.FieldType.Name, 
       field.Name, field.GetValue(obj)); 
     } 
    } 
} 

काम करने के लिए .NET 3.5 की आवश्यकता है() के रूप में

वापसी मान - प्रकार: MSDN राज्यों द्वारा परिभाषित System.Reflection.FieldInfo []

FieldInfo वस्तुओं की एक सरणी का प्रतिनिधित्व सभी सार्वजनिक क्षेत्र वर्तमान प्रकार के लिए परिभाषित किया गया है।

+0

संपत्तिइंफो और फील्डइन्फो में कौन सा नेमस्पेस है? – junkforce

+0

सिस्टम। प्रतिबिंब –

+0

सिस्टम। प्रतिबिंब –

1
static void ListArrayListMembers(ArrayList list) 
    { 
     foreach (object obj in list) 
     { 
      Type type = obj.GetType(); 
      foreach (FieldInfo field in type.GetFields(BindingFlags.Public)) 
      { 
       Console.WriteLine(field.Name + " = " + field.GetValue(obj).ToString()); 
      } 
     } 
    } 
6

आप सभी वस्तु प्राप्त कर सकते हैं फील्ड्स BindingFlags साथ कक्षा में सीधे घोषणा की:

GetFields(BindingFlags.Public | BindingFlags.Instance) 
1
बेशक

, एक और सवाल:

GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) 

और सभी वस्तु फील्ड्स के साथ विरासत में मिला सहित होगा "आपको सार्वजनिक क्षेत्र क्यों मिल गए हैं?" - गुण बेहतर है। एक अमूर्तता के रूप में, ध्यान दें कि प्रतिबिंब एकमात्र विकल्प नहीं है: रनटाइम पर ऑन-द-फ्लाई पर किसी प्रकार के गुणों का खुलासा करना भी संभव है (जैसे एक untyped DataTable/DataView गुणों के रूप में कॉलम का खुलासा करता है)। (किसी भी कोड को बदले बिना) उदाहरण के लिए, बेहद speeding up reflection -

 foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) 
     { 
      Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj)); 
     } 

यह भी कई तानाना विकल्प के लिए अनुमति देता है:

इसके समर्थन के लिए (जब भी सरल वस्तुओं का समर्थन), तो आपको TypeDescriptor का प्रयोग करेंगे।

+0

सुंदर पर काम करेगा।इसने मुझे एक अमूर्त सुपरक्लास के लिए एक सामान्य ToString() बनाने की अनुमति दी जो दो गुणों ("कुंजी" और "कोड" - डेटाबेस ऑब्जेक्ट क्लास था) दिखाती है कि इसके अधिकांश उप-वर्गों में कहा गया है कि उपरोक्त उप-वर्गों पर किसी भी विशिष्ट जानकारी की आवश्यकता के बिना :) – Nyerguds