2

我已经添加的列表项基于当前对象(obj)值进行更新。如何使列表不更新或如何复制 obj?

    public static void ReadData<T>(string filename, T obj,string node)
    {
        var xmlDocument = new XmlDocument();
        xmlDocument.Load(filename);
        List<T> objectList = new List<T>();
        XmlNodeList xmlNodeList = xmlDocument.SelectNodes("//"+node);

        for (var i = 0; i < xmlNodeList?.Count; i++)
        {
            var j = 0;
            foreach (var objectProperty in obj.GetType().GetProperties())
            {
                if (objectProperty.CanRead)
                {
                    object value;
                    if (objectProperty.PropertyType == typeof(bool))
                    {
                        value = bool.Parse(xmlNodeList[i].ChildNodes[j].InnerText);
                    }
                    else
                    {
                       value= xmlNodeList[i].ChildNodes[j].InnerText;
                    }
                    objectProperty.SetValue(obj, value);
                    j++;
                }
            }
            objectList.Add(obj);
        }

}

4

2 回答 2

3

1.你可以实现IConeable

public class ClonableClass : ICloneable
{
   public object Clone()
   {
      return this.MemberwiseClone();
   }
}

现在 a 和 b 不是指同一个对象。

var a = new ClonableClass ();
var b = (ClonableClass)a.Clone();

2.最简单的深度克隆方法是序列化对象然后反序列化它。

var objStr= JsonConvert.SerializeObject(obj);
var newObj = JsonConvert.DeserializeObject<T>(objStr);

3.另一种方式将需要蛮力编码,但您可以获得最后一点性能提升。您可以创建一个新对象,然后手动分配所有属性。

于 2018-01-26T09:41:57.137 回答
1

序列化和反序列化对象是克隆对象的一个​​选项。

public static T Clone<T>(this T source)
{
    var serialized = JsonConvert.SerializeObject(source);
    return JsonConvert.DeserializeObject<T>(serialized);
}

然后克隆所需的对象;

var obj = new SampleClass
{
    Id = 1,
    Name = ""
};
var clonedObj = obj.Clone();
于 2018-01-26T09:50:50.010 回答