C# 向现有列表中添加新列
我有一个带有字段的类-Id、name、company和另外29个字段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; }
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();