वर्ग गुणों के माध्यम से C # Iterate


118

मैं वर्तमान में अपनी कक्षा ऑब्जेक्ट के सभी मान सेट कर रहा हूं 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)];
}

1
क्या आपने प्रतिबिंब की कोशिश की है? stackoverflow.com/questions/997747/…
kol

1
pls इस लिंक पर एक नज़र डालें stackoverflow.com/questions/721441/…
Enigma State

क्या आप समझा सकते हैं कि आप परिणाम में किसी संपत्ति और सूचकांक के बीच संबंध कहाँ और कैसे बनाए रखना चाहेंगे?
एर्नो

जवाबों:


226

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

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

Record record = new Record();

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

valueवह मान कहां है, जिसमें आप लिखना चाहते हैं (इसलिए अपने resultItemsऐरे से)।


1
क्या होगा यदि मैं एक संपत्ति के बजाय संपत्ति का उपयोग करना चाहता हूं। मूल्य के बजाय गेटवैल्यू (someOtherClassObjectHavingExacltySameProperties) ? (मैंने इस संपत्ति की कोशिश की । SetValue (objAppointment, property.GetValue (Temp)); लेकिन यह मुझे देता है, {"ऑब्जेक्ट टारगेट टाइप से मेल नहीं खाता।"} )
आसिफ महमूद 31

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

1
यह एक पूर्ण जीवन रक्षक है - धन्यवाद! मैं यह जांचने के लिए सभी वर्ग गुणों के माध्यम से पुनरावृत्ति कर रहा हूं कि मेरे पास एक मूल्य है (इसे एक्सएमएल पर लिखने से पहले)
कॉर्डेल

@ कॉर्डेल, आपने ऐसा कैसे किया? मैंने प्रॉपर्टी की कोशिश की ।GetValue () लेकिन यह पैरामीटर के रूप में एक ऑब्जेक्ट के लिए पूछता है।
user7792598

@ user7792598 आपको उस ऑब्जेक्ट में पास करना होगा जिससे आप संपत्ति मूल्य प्राप्त करना चाहते हैं। यदि आपको और मदद की जरूरत है, तो एक और स्टैकऑवरफ्लो प्रश्न पोस्ट करें
शमूएल स्लेड

17
// 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]);
}

1
यह अच्छा लग रहा है, लेकिन मैं वहाँ फ़ील्डनामों को हार्ड कोड करने के बजाय इसे गतिशील रूप से करने की उम्मीद कर रहा था। क्या यह संभव है? साभार
ल्यूक

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

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

1
@Coulton आप प्रत्येक संपत्ति को गतिशील रूप से एक सूचकांक में कैसे जोड़ सकते हैं? यह संभव नहीं है।
एमी

आप सी # 6.0 के रूप में हार्ड कोडिंग से बचने के nameof(Item.Field)बजाय कोशिश कर सकते हैं"itemtype"
पैट्रिक माइकल्सन

2

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

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

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

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


1

मैंने कोशिश की कि सैमुअल स्लेड ने क्या सुझाव दिया है। मेरे लिए काम नहीं किया। PropertyInfo सूची खाली के रूप में आ रहा था। इसलिए, मैंने निम्नलिखित कोशिश की और यह मेरे लिए काम कर गया।

    Type type = typeof(Record);
    FieldInfo[] properties = type.GetFields();
    foreach (FieldInfo property in properties) {
       Debug.LogError(property.Name);
    }

1
ऐसा इसलिए होगा क्योंकि आपके प्रकार में केवल फ़ील्ड हैं, गुण नहीं !?
जामहार्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.