C # 迭代类属性

我当前正在设置类对象 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)];
}
204725 次浏览
// 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]);
}

您可以使用反射来完成此操作。据我所知,您可以枚举类的属性并设置值。但是,您必须尝试这种方法,并确保理解属性的顺序。有关此方法的更多信息,请参考此 MSDN 文档

作为提示,你可以这样做:

Record record = new Record();


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

其中 value是要写入的值(从 resultItems数组)。

是的,您可以在 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 的响应(这是非常好的)。考虑两件事:

  1. GetProperties ()只提供类中 PUBLIC 属性的列表(不包括任何 PRIVATE 属性)。
  2. 您应该意识到,您调用 SetValue ()的每个属性都应该有一个 setter 方法来执行此操作,否则将抛出 ArgumentException (即: “未找到属性的 set 访问器”)。

尽管如此,特别注意没有 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);
};
}

希望这条评论能为你节省一些时间!

干杯