Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使列表项值不引用对象_C#_List_Object_Generics_Xmldatasource - Fatal编程技术网

C# 如何使列表项值不引用对象

C# 如何使列表项值不引用对象,c#,list,object,generics,xmldatasource,C#,List,Object,Generics,Xmldatasource,已添加的我的列表项根据当前对象(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&

已添加的我的列表项根据当前对象(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);
        }
publicstaticvoidreaddata(字符串文件名、tobj、字符串节点)
{
var xmlDocument=新的xmlDocument();
加载(文件名);
List objectList=新列表();
XmlNodeList XmlNodeList=xmlDocument.SelectNodes(“/”+节点);
对于(变量i=0;i

}

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);
var objStr=JsonConvert.serialized对象(obj);
var newObj=JsonConvert.DeserializeObject(objStr);

3.另一种方法需要暴力编码,但您可以获得最后一点性能增益。您只需创建一个新对象,然后手动分配所有属性。

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

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

如果
T
struct
,则它已经是一个副本。如果
T
,那么:唯一的方法是通过浅克隆或深克隆。此时,您应该搜索“如何在.NET中克隆对象”“如何克隆非特定对象?”——两个人已经为您提供了两种不同的方法;你也试过了吗?它是如何进行的?注意,这将起作用,但实现了一个浅层克隆;了解克隆是浅的还是深的通常很重要。我可能还建议修复类型,即
public Foo Clone(){/*actual code*/}对象ICloneable.Clone()=>Clone()为了简单起见,您只需序列化对象,然后反序列化它。
var obj = new SampleClass
{
    Id = 1,
    Name = ""
};
var clonedObj = obj.Clone();