C# 在对象列表中指定特性

C# 在对象列表中指定特性,c#,list,foreach,C#,List,Foreach,我有一个需要指定多个属性的对象列表 虽然我怀疑数据的来源是否重要,但我会将其作为背景资料。我正在使用foreach循环从XmlDocument中的选择节点读取属性列表。我已经创建了一个循环迭代器,并尝试根据attribute.Name和attribute.Value将值分配给每个对象中的属性 // Reads each attribute: label, type, number etc... foreach (XmlNode node in myValues.SelectNodes("

我有一个需要指定多个属性的对象列表

虽然我怀疑数据的来源是否重要,但我会将其作为背景资料。我正在使用foreach循环从XmlDocument中的选择节点读取属性列表。我已经创建了一个循环迭代器,并尝试根据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;

它快把我逼疯了。必须有某种方法引用属性的值。名称

首先需要找到要更新循环中属性的对象。你可以使用LINQ,因为它已经回答了多次@SO like,在这篇文章中:


然后可以更新属性…

首先需要找到要在循环中更新属性的对象。你可以使用LINQ,因为它已经回答了多次@SO like,在这篇文章中:


然后您可以更新属性…

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

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

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

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

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

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

VisualStudio的一个很酷的特性(现在是2015年,不确定它是什么时候推出的),您可以“将XML粘贴为类”

  • 将目标XML文档复制到复制缓冲区(ctrl+c)
  • 在Visual Studio中打开新的类文件
  • 在名称空间内部,但不是类(这将创建类)放置游标
  • 使用菜单编辑->粘贴特殊->将XML粘贴为类
  • 然后您应该会看到Visual Studio生成的类。注意:我发现,当它看到一个数字时,如果数字小于255,它将创建一个
    字节的字段。
    。我必须在后记中将这些字段更改为
    int
    s。这是一个快速查找和替换的过程,但如果遇到d,这是一个重要的步骤e工业化问题

    生成类后,只需进行简单的反序列化,下面是一些示例代码:

    //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);
    }
    

    然后您可以使用该对象并获得所需的值。

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

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

    VisualStudio的一个很酷的特性(现在是2015年,不确定它是什么时候推出的),您可以“将XML粘贴为类”

  • 将目标XML文档复制到复制缓冲区(ctrl+c)
  • 在Visual Studio中打开新的类文件
  • 在名称空间内部,但不是类(这将创建类)放置游标
  • 使用菜单编辑->粘贴特殊->将XML粘贴为类
  • 然后您应该会看到Visual Studio生成的类。注意:我发现,当它看到一个数字时,如果数字小于255,它将创建一个
    字节的字段。
    。我必须在后记中将这些字段更改为
    int
    s。这是一个快速查找和替换的过程,但如果遇到d,这是一个重要的步骤e工业化问题

    生成类后,只需进行简单的反序列化,下面是一些示例代码:

    //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);
    }
    

    然后,您可以使用对象并获得所需的值。

    您可以使用反射,但听起来您真正需要做的是将XML反序列化为POCO:您可以使用反射,但听起来您真正需要做的是将XML反序列化为POCO: