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 ответа:
вы могли бы использовать отражение, чтобы сделать это. Насколько я понимаю, вы можете перечислить свойства вашего класса и установить значения. Вы должны были бы попробовать это и убедитесь, что вы понимаете порядок свойств, хотя. Обратитесь к этому Примечание для получения дополнительной информации об этом подходе.
за подсказку, вы могли бы сделать что-то вроде:
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 } } } }
в качестве альтернативы, как уже упоминалось, используйте отражение.