C# итерация по свойствам класса


В настоящее время я устанавливаю все значения моего класса object 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)];
}
3 73

3 ответа:

вы могли бы использовать отражение, чтобы сделать это. Насколько я понимаю, вы можете перечислить свойства вашего класса и установить значения. Вы должны были бы попробовать это и убедитесь, что вы понимаете порядок свойств, хотя. Обратитесь к этому Примечание для получения дополнительной информации об этом подходе.

за подсказку, вы могли бы сделать что-то вроде:

Record record = new Record();

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

здесь value это значение, которое вы хотите записать (так от вашего resultItems массив).

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

Да, вы можете создать индексатор в своем классе записей, который сопоставляет имя свойства с правильным свойством. Это позволит сохранить все привязки от имени свойства к свойству в одном месте, например:

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

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

в качестве альтернативы, как уже упоминалось, используйте отражение.