2011-11-16 16 views
62

मैं वर्तमान में मेरी कक्षा वस्तु Record के मूल्यों के सभी के माध्यम से सेट कर रहा हूं।सी # दोहराएं कक्षा गुण

इस कोड है कि मैं इस समय रिकॉर्ड, संपत्ति से संपत्ति को भरने के लिए उपयोग कर रहा हूँ है।

// Loop through each field in the result set 
for (int i = 0; i <= resultItems.Length; i++) 
{ 

    Record newRecord = new Record() 
    { 
      itemtype = resultItems[i - (fieldCount - 0)], 
      itemdesc = resultItems[i - (fieldCount - 1)], 
      prodcode = resultItems[i - (fieldCount - 2)], 
      proddesc = resultItems[i - (fieldCount - 3)], 
      curstat = resultItems[i - (fieldCount -4)], 
      totfree = resultItems[i - (fieldCount -5)], 
      totphys = resultItems[i - (fieldCount -6)], 
      pcolgroup = resultItems[i - (fieldCount -7)], 
      scolgroup = resultItems[i - (fieldCount -8)], 
      totpo =  resultItems[i - (fieldCount - 9)], 
      totso =  resultItems[i - (fieldCount - 10)], 
      quality = resultItems[i - (fieldCount - 11)], 
      statusdesc = resultItems[i - (fieldCount - 12)], 
      groupcode = resultItems[i - (fieldCount - 13)], 
      qualitydes = resultItems[i - (fieldCount - 14)], 
      pcoldesc = resultItems[i - (fieldCount - 15)], 
      scoldesc = resultItems[i - (fieldCount - 16)], 
      pgroupdesc = resultItems[i - (fieldCount - 17)], 
    }; 
} 

क्या मैं संपत्तियों के सभी नामों को हार्ड कोडिंग किए बिना गतिशील रूप से प्रत्येक गुण के माध्यम से पुनरावृत्त कर सकता हूं?

कुछ तो जैसे:

// Create new Record instance 
Record newRecord = new Record(); 

for (int e = 0; e < propertyCount.Length - 1; e++) 
{ 
    newRecord[fieldname] = resultItems[i - (fieldCount - e)]; 
} 
+0

क्या आपने प्रतिबिंब की कोशिश की है? http://stackoverflow.com/questions/997747/c-sharp-reflection-accessing-the-fields-of-a-struct – kol

+1

कृपया इस लिंक http://stackoverflow.com/questions/721441/c पर एक नज़र -sharp-how-to-iterate-through-classes-फ़ील्ड-और-सेट-गुण –

+0

क्या आप समझा सकते हैं कि आप कहां और कैसे एक संपत्ति और इंडेक्स के बीच रिश्ते को बनाए रखना चाहते हैं Items array? –

उत्तर

140

आप संभवतः प्रतिबिंब का उपयोग करते हैं सकता है। जहां तक ​​मैं इसे समझता हूं, आप अपनी कक्षा के गुणों का आकलन कर सकते हैं और मान निर्धारित कर सकते हैं। आपको इसे आजमाएं और सुनिश्चित करें कि आप गुणों के क्रम को समझते हैं। इस दृष्टिकोण पर अधिक जानकारी के लिए इस MSDN Documentation का संदर्भ लें।

एक संकेत के लिए, आप संभवतः की तरह कुछ कर सकता है:

Record record = new Record(); 

PropertyInfo[] properties = typeof(Record).GetProperties(); 
foreach (PropertyInfo property in properties) 
{ 
    property.SetValue(record, value); 
} 

कहाँ value मूल्य आप में लिखने के लिए (ताकि आपके resultItems सरणी से) चाहने रहे हैं।

+0

के रूप में मुश्किल कोडिंग से बचने के लिए क्या होगा यदि मैं एक का उपयोग करने के लिए * property.Getvalue (someOtherClassObjectHavingExacltySameProperties) * बजाय चाहते हैं * मूल्य *? (मैं इस ** संपत्ति की कोशिश की .SetValue (objAppointment, property.GetValue (अस्थायी));? ** लेकिन यह मुझे देता है, ** { "वस्तु लक्ष्य प्रकार से मेल नहीं खाता।"} **) –

+0

@MalikAsif मैं यकीन नहीं है कि मैं पूरी तरह से समझता हूं, लेकिन ऐसा लगता है कि आप एक अलग प्रकार से संपत्ति लोड करने की कोशिश कर रहे हैं। यदि आप उदाहरण के साथ SO पर एक प्रश्न पोस्ट करते हैं और इसे यहां लिंक करते हैं, तो मैं आपके लिए एक नज़र डालेगा। –

12
// the index of each item in fieldNames must correspond to 
// the correct index in resultItems 
var fieldnames = new []{"itemtype", "etc etc "}; 

for (int e = 0; e < fieldNames.Length - 1; e++) 
{ 
    newRecord 
     .GetType() 
     .GetProperty(fieldNames[e]) 
     .SetValue(newRecord, resultItems[e]); 
} 
+0

यह अच्छा लग रहा है, लेकिन मैं वहां क्षेत्रीय नामों को कड़ी कोडिंग करने की बजाए गतिशील रूप से ऐसा करने की उम्मीद कर रहा था। क्या यह संभव है? धन्यवाद – Luke

+0

यह भी लगता है कि 'गेटप्रॉपर्टी' संपत्ति मेरे वर्ग के उदाहरण के लिए उपलब्ध नहीं है। :/ – Luke

+0

नहीं, परिणाम इटैम इंडेक्स और संपत्ति के नाम के बीच कहीं मैपिंग होने की आवश्यकता है। – jgauffin

1

हाँ, आप सही संपत्ति के लिए संपत्ति नाम से नक्शे अपने रिकार्ड वर्ग पर एक इंडेक्सर बना सकता है। यह एक ही स्थान पर जैसे में संपत्ति के लिए सभी संपत्ति नाम से बाध्यकारी रखने होगा:

public class Record 
{ 
    public string ItemType { get; set; } 

    public string this[string propertyName] 
    { 
     set 
     { 
      switch (propertyName) 
      { 
       case "itemType": 
        ItemType = value; 
        break; 
        // etc 
      } 
     } 
    } 
} 

वैकल्पिक रूप से, के रूप में दूसरों का उल्लेख किया है, उपयोग प्रतिबिंब।

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