【问题标题】:Assigning properties in List of objects在对象列表中分配属性
【发布时间】:2016-10-05 07:49:10
【问题描述】:

我有一个需要分配多个属性的对象列表。

虽然我怀疑数据的来源很重要,但我还是将其包含在背景中。我正在使用 foreach 循环从 XmlDocument 中的选定节点读取属性列表。我创建了一个循环迭代器 i 并尝试根据 attribute.Name 和 attribute.Value 将值分配给每个对象中的属性。

  // Reads each attribute: label, type, number etc...
  foreach (XmlNode node in myValues.SelectNodes("//Properties"))
  {
    foreach (XmlAttribute attribute in node.Attributes)
    {

      //this iterates through the attributes just fine
      //and in each iteration attribute.Name = the property
      //I want to set and attribute.Value = the value to set it to.

      myList[i].label = attribute.Value; //works

      //what I'd like to do something like
      myList[i].attribute.Name = attribute.Value;

这让我发疯了。一定有办法引用attribute.Name的值?

【问题讨论】:

标签: c# list foreach


【解决方案1】:

您可以使用反射通过名称设置属性,例如:

var current = myList[i];
current.GetType().GetProperty(attribute.Name).SetValue(current, attribute.Value);

【讨论】:

    【解决方案2】:

    您可以将 XML 文档反序列化为 POCO 对象。我个人更喜欢这种方法而不是反射,它让我可以更好地控制正在发生的事情并且更容易看到。

    最大的问题是创建要反序列化的 POCO 对象。

    Visual Studio 的一个很酷的功能(这是 2015 年,不确定何时引入),您可以“将 XML 粘贴为类”

    1. 将目标 XML 文档复制到您的复制缓冲区 (ctrl+c)

    1. 在 Visual Studio 中打开一个新的类文件。
    2. 在命名空间内部,而不是他的类(这将创建放置你的光标的类。
    3. 使用菜单编辑 -> 选择性粘贴 -> 将 XML 粘贴为类

    然后您应该会看到 Visual Studio 生成的类。 注意:我发现当它看到一个数字时,如果数字低于 255,它会将该字段创建为 byte。我不得不在后记中将它们更改为ints。这是一个快速查找和替换的方法,但如果您遇到反序列化问题,这是一个重要的步骤。

    一旦生成了类,反序列化就很简单了,这里有一些示例代码:

    //Object to deserialize into
    MySerializableClass myObject;
    
    //Create deserializer for object
    XmlSerializer mySerializer = new XmlSerializer(typeof(MySerializableClass));
    
    //Open XML file to read
    using (FileStream myFileStream = new FileStream("myFileName.xml", FileMode.Open))
    {
      //Deserialize XML into your POCO object
      myObject = (MySerializableClass) mySerializer.Deserialize(myFileStream);
    }
    

    然后你就可以使用该对象并获取你想要的值了。

    【讨论】:

      【解决方案3】:

      您首先需要找到要在循环中更新属性的对象。您可以使用 LINQ 已经多次回答@SO,就像在这篇文章中一样:

      Using LINQ, how do I find an object with a given property value from a List?

         Question question14 = _mQuestions.FirstOrDefault(q => q.QuestionID == 14);
         if (question14 != null)
             question14.QuestionAnswer = "Some Text";
      

      然后你可以更新属性...

      【讨论】:

        猜你喜欢
        • 2017-06-04
        • 1970-01-01
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        相关资源
        最近更新 更多