2012-03-27 15 views
56

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

मेरी वर्गों के लिए कुछ इकाई परीक्षण बनाते समय मैंने तय कर लिया कि मैं उस वस्तु के प्रत्येक संपत्ति के माध्यम से सूची में प्रत्येक वस्तु और फिर पाश के माध्यम से लूप चाहता था ...

मैंने सोचा था कि यह कर के रूप में सरल हो जाएगा। ..

foreach (Object obj in theList) 
{ 
    foreach (Property theProperties in obj) 
    { 
     do some stufff!!; 
    } 
} 

लेकिन यह काम नहीं किया! :( मैं यह त्रुटि ...

"foreach बयान प्रकार 'Application.Object' के चर पर काम नहीं कर सकते क्योंकि 'Application.Object' 'GetEnumerator' के लिए एक सार्वजनिक परिभाषा शामिल नहीं है"

करता मिलता है किसी को भी कुछ भी बहुत जटिल में प्राप्त किए बिना भारतीय विदेश सेवा और छोरों या टन के बिना ऐसा करने का एक तरीका है के बारे में पता

+4

भविष्य में, कृपया एक प्रश्न में "यह काम नहीं करता" कहें। इसके बजाय, आपके पास होने वाली समस्या निर्दिष्ट करें (कंपाइलर त्रुटि, आदि)। धन्यवाद! –

+0

अपडेटेड! रॉबर्ट – Jammerz858

उत्तर

91

इस आजमाएँ:?

foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties()) 
{ 
    // do stuff here 
} 

इसके अलावा कृपया ध्यान दें Type.GetProperties() एक अधिभार है जो बाध्यकारी झंडे का एक सेट स्वीकार करता है ताकि आप एक्सेसिबिलिटी स्तर जैसे विभिन्न मानदंडों पर गुणों को फ़िल्टर कर सकें, अधिक जानकारी के लिए एमएसडीएन देखें: Type.GetProperties Method (BindingFlags) अंतिम लेकिन कम से कम "system.Reflection" असेंबली संदर्भ जोड़ने के लिए मत भूलना।

उदाहरण के लिए सभी सार्वजनिक संपत्तियों को हल करने:

foreach (var propertyInfo in obj.GetType() 
           .GetProperties(
             BindingFlags.Public 
             | BindingFlags.Instance)) 
{ 
    // do stuff here 
} 

कृपया मुझे पता है कि क्या यह काम करता है के रूप में उम्मीद करते हैं।

+1

के सिर के लिए धन्यवाद, जब आपके पास ऑब्जेक्ट गुणों पर एक संभाल हो, तो क्या प्रत्येक संपत्ति के मूल्य को पकड़ने के लिए वैसे भी है? यानी उदाहरण के लिए नाम या पोस्टकोड – JsonStatham

2

उपयोग प्रतिबिंब इस

SomeClass A = SomeClass(...) 
PropertyInfo[] properties = A.GetType().GetProperties(); 
12

Your'e करने के लिए लगभग वहाँ, तुम बस, प्रकार से गुण प्राप्त करने के बजाय उम्मीद गुण एक संग्रह या संपत्ति बैग के रूप में सुलभ होने के लिए की जरूरत है :

property.Name 
property.GetValue(obj, null) 

वाई:

var property in obj.GetType().GetProperties() 

वहाँ you can access like so से वें GetValue दूसरा पैरामीटर आपको इंडेक्स वैल्यू निर्दिष्ट करने की अनुमति देगा, जो गुणों को लौटने वाले गुणों के साथ काम करेगा - चूंकि स्ट्रिंग वर्णों का संग्रह है, इसलिए यदि आवश्यकता हो तो आप एक चरित्र को वापस करने के लिए एक इंडेक्स भी निर्दिष्ट कर सकते हैं।

+0

क्या मैंने किसी को परेशान किया? मैं यह जानकर खुला हूं कि इसके बारे में क्या गलत है, अन्यथा मैं कभी नहीं सीख सकता। –

+0

जब आपका कोड गलत था (आपके निंजा संपादन से पहले) आपको शायद डाउनवोट मिल गया था। –

13

ज़रूर, कोई समस्या नहीं:

foreach(object item in sequence) 
{ 
    if (item == null) continue; 
    foreach(PropertyInfo property in item.GetType().GetProperties()) 
    { 
     // do something with the property 
    } 
} 
+0

आपने यह लाइन क्यों जोड़ा? 'अगर (item == null) जारी रखें; 'व्यक्तिगत रूप से, मुझे लगता है कि अगर आपको उस बिंदु पर एक शून्य वस्तु मिली है, तो कुछ पहले गलत हो गया था और यही वह जगह है जहां सत्यापन होना चाहिए, या मैं गलत हूं? – Dementic

+0

@ डिमेंटिक: निश्चित रूप से, हम कह सकते हैं कि अनुक्रम में गैर-शून्य संदर्भ शामिल होना आवश्यक है। –

20

आप कर सकते हैं इस तरह एक वस्तु की सभी गैर अनुक्रमित गुण के माध्यम से लूप:

var s = new MyObject(); 
foreach (var p in s.GetType().GetProperties().Where(p => !p.GetGetMethod().GetParameters().Any())) { 
    Console.WriteLine(p.GetValue(s, null)); 
} 

GetProperties() के बाद रिटर्न indexers के साथ ही साधारण गुण, GetValue पर कॉल करने से पहले आपको एक अतिरिक्त फ़िल्टर चाहिए, यह जानने के लिए कि null को दूसरे पैरामीटर के रूप में पास करना सुरक्षित है।

आपको केवल लिखने के लिए फ़िल्टर को संशोधित करने की आवश्यकता हो सकती है ताकि केवल लिखने के लिए और अन्यथा पहुंच योग्य गुणों को बुझाया जा सके।

+0

+1 केवल उन गुणों के साथ कुछ करने के लिए जो वास्तव में उपयोग किए जा सकते हैं - आप केवल लेखन-योग्य गुणों को फ़िल्टर करना भी चाह सकते हैं। – hvd

+0

@hvd यह केवल लिखने वाले गुणों पर एक उत्कृष्ट बिंदु है! मैं उनके बारे में लगभग भूल गया हूँ। मेरा कोड दुर्घटनाग्रस्त हो जाएगा यदि यह 'नल' गेटटर वाली संपत्ति से मुकाबला करता है, लेकिन मुझे यकीन है कि ओपी यह पता लगाएगा कि उसे केवल उन्हीं संपत्तियों को कैसे प्राप्त किया जाए। – dasblinkenlight

+1

मूल्य प्राप्त करने के तरीके को दिखाने के लिए अप-वोट किया गया –

0

सावधानी के एक छोटे से शब्द, यदि "कुछ सामान करें" का अर्थ है कि आप जिस वास्तविक संपत्ति का दौरा करते हैं उसका मूल्य अपडेट करना और यदि रूट ऑब्जेक्ट से पथ के साथ एक प्रॉपर्टी टाइप प्रॉपर्टी है, तो आपके द्वारा किए गए परिवर्तन संपत्ति पर रूट ऑब्जेक्ट पर दिखाई नहीं देगा।

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

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