c#迭代类属性
本文关键字:属性 迭代 | 更新日期: 2023-09-27 18:15:04
我目前正在设置我的类对象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)];
}
您可以使用反射来做到这一点。据我所知,您可以枚举类的属性并设置值。你需要尝试一下确保你理解了这些性质的顺序。有关此方法的更多信息,请参阅此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);
}
添加到Samuel Slade的对选择该方法的任何人的回应(非常出色)。考虑两件事:
- GetProperties()只提供类中PUBLIC属性的列表。(任何PRIVATE的将不包括在内)。
- 你应该意识到你调用SetValue()的每个属性都应该有一个setter方法来做这件事,否则会抛出一个ArgumentException(即:"该属性的set accessor未找到")。
话虽如此,要特别注意没有setter方法的属性,如下所示:
public string Username { get; set; }
public bool HasCar
{
get
{
return this.Car != null;
}
}
这里第一个属性可以被设置为指定的值,但第二个属性不能,因为它没有setter方法。我解决这个问题的方法是在属性上使用GetSetMethod()来区分没有setter方法的属性,如下所示:
var properties = this.GetType().GetProperties();
foreach(var prop in properties)
{
if(prop.GetSetMethod() != null) {
prop.SetValue(this, null);
};
}
希望这个评论可以节省你的时间!
欢呼