【问题标题】:Changing the properties of an object in a foreach loop在 foreach 循环中更改对象的属性
【发布时间】:2013-03-21 17:15:48
【问题描述】:

我的班级

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++;
} 

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

【问题讨论】:

    标签: c# class object dynamic foreach


    【解决方案1】:

    不,你不能,无论如何不容易。这通常使用对象初始化器来完成,这样就省去了多次写出变量名的麻烦。

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

    你可以用 reflection 做这样的事情,但你会失去类型安全,因为你会为 ith 索引分配一个值,我不太确定属性的顺序是什么当你提取它们时。反射是 C# 中一个相当高级(并且具有潜在危险)的部分,您可能应该远离它,直到您真正需要它为止。

    【讨论】:

      【解决方案2】:

      你可以尝试用反射来做到这一点,比如

      john.GetType().GetProperties();

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

      john.name = myList[0];
      ..
      

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

      【讨论】:

        【解决方案3】:

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

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

        不幸的是,手册上说

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

        所以您仍然必须手动将infomyList 匹配。

        【讨论】:

          【解决方案4】:

          你看过这些帖子吗?

          How to get the list of properties of a class?

          Get string name of property using reflection

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

          【讨论】:

            【解决方案5】:

            要做到这一点还有很长的路要走。如果您知道您的列表将始终采用这种格式,请执行以下操作。

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

            【讨论】:

              猜你喜欢
              • 2020-06-05
              • 2013-07-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多