在foreach循环中更改对象的属性

时间:2013-03-31 13:17:29

标签: c# class object dynamic foreach

我的班级

class person
{
    public string name;
    public string age;
    public string height;
    public string weight;
}

这就是我想要做的......

person john = new person();
int i=0;

List<string> myList = new List<string>() { "John", "22", "174cms" ,"60kgs"};  
foreach(property in john)
{
    property = myList[i].toString();
    i++;
} 

我该怎么做?或者我真的可以这样做吗?

5 个答案:

答案 0 :(得分:2)

不,你不能,不管怎么说都不容易。这通常使用对象初始化器来完成,这样可以省去多次写出变量名的麻烦。

person john = new person
{
    name = "John",
    age = "22",
    height = "174cms",
    weight = "60kgs"
};

您可以使用reflection执行此类操作,但是您将失去类型安全性,因为您要为i索引分配值而我不太确定该命令的顺序是什么当你提取它们时,属性就会出现。反射是C#的一个非常先进(并且有潜在危险)的部分,你可能应该远离它,直到你确实需要它为止。

答案 1 :(得分:1)

你看过这些帖子吗?

How to get the list of properties of a class?

Get string name of property using reflection

我希望这会对你有所帮助。可以使用数据表而不是列表,并将每列命名为类中每个属性的名称。

答案 2 :(得分:0)

您可以尝试使用Reflection进行此操作,例如

john.GetType().GetProperties();

但是 - 不要这样做!考虑更改您的实施以使其更好地发挥作用 例如 - 如果您应该以这种方式使用列表和人员详细信息,并且myList属性始终按相同顺序排列 - 更新john特定属性,例如:

john.name = myList[0];
..

但我建议重新设计你的解决方案。

答案 3 :(得分:0)

您可以使用Type.GetProperties来检索属性

PropertyInfo[] info = john.GetType().GetProperties();

不幸的是,手册说

  

<强>说明
  GetProperties方法不以特定顺序返回属性,例如按字母顺序或声明顺序。您的代码不得依赖于返回属性的顺序,因为该顺序会有所不同。

因此,您仍必须手动将infomyList匹配。

答案 4 :(得分:0)

有很长的路要走。如果你知道你的列表总是采用这种格式,那就做一些像。

var john = new person 
{
    name = myList[0],
    age = myList[1],
    height = myList[2],
    weight = myList[3]
}