C# 向现有列表中添加新列

C# 向现有列表中添加新列,c#,list,xml-parsing,C#,List,Xml Parsing,我有一个带有字段的类-Id、name、company和另外29个字段 public class Employee { [XmlAttribute("textbox1")] public int Id { get; set; } [XmlAttribute("textbox11")] public string Name { get; set; } [XmlAttribute("textbox21")] public string Company { get; set; }

我有一个带有字段的类-Id、name、company和另外29个字段

public class Employee
{
  [XmlAttribute("textbox1")]
  public int Id { get; set; }
  [XmlAttribute("textbox11")]
  public string Name { get; set; }
  [XmlAttribute("textbox21")]
  public string Company { get; set; }
  [XmlAttribute("textbox22")]
  public bool Val1 { get; set; }
  [XmlAttribute("textbox23")]
  public bool Val2 { get; set; }
  public bool TestSomething{get;set;}
}


public class ParseData()
{
   List<Employee> employee = new List<Employee>();
   XmlSerialiser serializer = new XmlSerializer();
   using(FileStream stream = new FileStream("test.xml", FileMode.Open))
   {
       employees = (Employee)serializer.Deserialize(stream);
   }

  //Todo: Add the new calculated value TestSomething

}

对此,如有任何建议,将不胜感激

下面的代码片段是我用来序列化和反序列化xml字符串的扩展方法。注意,这些需要放在一个静态类中,并在类中引用以供使用

    /// <summary>
    /// Serializes the object to xml string.
    /// </summary>
    /// <returns>xml serialization.</returns>
    public static string SerializeToXml<T>(this T instance)
        where T : class, new()
    {
        string result;

        var format = new XmlSerializer(typeof(T));
        using (var strmr = new StringWriter())
        {
            format.Serialize(strmr, instance);
            result = strmr.ToString();
        }

        return result;
    }

    /// <summary>
    /// Deserializes xml serialized objects.
    /// </summary>
    /// <param name="xmlDocument">serialized string.</param>
    /// <param name="result">out parameter.</param>
    /// <returns>Instance object.</returns>
    public static bool TryParseXml<T>(this string xmlDocument, out T result)
        where T : class, new()
    {
        result = null;

        if (string.IsNullOrWhiteSpace(xmlDocument))
        {
            return false;
        }

        try
        {
            using (TextReader str = new StringReader(xmlDocument))
            {
                var format = new XmlSerializer(typeof(T));
                XmlReader xmlReader = XmlReader.Create(str);
                if (format.CanDeserialize(xmlReader))
                {
                    result = format.Deserialize(xmlReader) as T;
                }
            }
        }
        catch (InvalidOperationException)
        {
            return false;
        }

        return !(result is null);
    }
如果我想存储
MyPoint
的列表而不需要太多繁重的工作,我可以使用上面的
SerializeToXml
方法直接序列化该类

var myPoints = new List<MyPoint>{new MyPoint{ X= 1, Y = 2}, new MyPoint{X = 3, Y = 4}};

var xmlString = myPoints.SerializeToXml();
现在,当我解析xml时,我将得到具有新属性的类。使用
TryParseXml
我得到了我的积分列表

// assume I have a string already from the xml document to use.

List<MyPoint> points = null;

if(serializedPoints.TryParse(out points))
{
    foreach(var point in points)
    {
        point.Z = X * X + Y * Y;
    }
}


var serializedPointsWithZ = points.SerializeToXml();
//假设我已经从xml文档中获得了一个要使用的字符串。
列表点=空;
if(序列化点.锥巴色(输出点))
{
foreach(变量点到点)
{
点Z=X*X+Y*Y;
}
}
var serializedPointsWithZ=points.SerializeToXml();

现在,
serializedPointsWithZ
只是一个可以写入文件等的字符串。

这个问题非常不清楚。首先,
现在我有一个新字段,它必须根据序列化后得到的值进行计算
这意味着什么?其次,您是否将该属性添加到派生xml的类中?@FelixCastor添加了更多信息
var myPoints = new List<MyPoint>{new MyPoint{ X= 1, Y = 2}, new MyPoint{X = 3, Y = 4}};

var xmlString = myPoints.SerializeToXml();
public class MyPoint
{
    public double X { get; set;}
    public double Y { get; set;}
    public double Z { get; set;}  // <---- Here
}
// assume I have a string already from the xml document to use.

List<MyPoint> points = null;

if(serializedPoints.TryParse(out points))
{
    foreach(var point in points)
    {
        point.Z = X * X + Y * Y;
    }
}


var serializedPointsWithZ = points.SerializeToXml();