현재 클래스 개체의 모든 값을 설정하고 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)];
}
답변
이를 위해 Reflection을 사용할 수 있습니다. 내가 이해하는 한, 클래스의 속성을 열거하고 값을 설정할 수 있습니다. 이것을 시도하고 속성의 순서를 이해했는지 확인해야합니다. 이 접근 방식에 대한 자세한 내용은 이 MSDN 설명서 를 참조하십시오.
힌트를 얻으려면 다음과 같이 할 수 있습니다.
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]);
}
답변
예, 속성 이름에서 올바른 속성으로 매핑되는 Record 클래스에 인덱서를 만들 수 있습니다. 이것은 속성 이름에서 속성으로의 모든 바인딩을 한 곳에서 유지합니다.
public class Record
{
public string ItemType { get; set; }
public string this[string propertyName]
{
set
{
switch (propertyName)
{
case "itemType":
ItemType = value;
break;
// etc
}
}
}
}
또는 다른 사람들이 언급했듯이 반사를 사용하십시오.
답변
나는 Samuel Slade 가 제안한 것을 시도 했습니다. 나를 위해 일하지 않았다. PropertyInfo
목록이 비어로오고 있었다. 그래서 나는 다음을 시도했고 그것은 나를 위해 일했습니다.
Type type = typeof(Record);
FieldInfo[] properties = type.GetFields();
foreach (FieldInfo property in properties) {
Debug.LogError(property.Name);
}