先用一句话简单解释下浅拷贝和深拷贝是什么意思:
好像说不明白,那就两句话吧。
首先不管是深拷贝还是浅拷贝都是针对引用对象(详解:https://www.cnblogs.com/personblog/p/11308831.html)
如果是浅拷贝,那么拷贝对象中的引用对象是直接复制的引用对象(是同一个东西);
如果是深拷贝,那么拷贝对象中的引用对象也会复制出新的一份到新对象中。
为什么说是针对引用对象,因为值对象都是直接复制过来的。
直接上代码吧,然后再看看怎么处理浅拷贝的问题;
UserDTO a = new UserDTO() { Name = "Lee", ID = "1" }; UserDTO b = new UserDTO(); b = a; Console.WriteLine(b.Equals(a)); Console.WriteLine("-----------"); b.Name = "Mac"; Console.WriteLine(a.Name);
其中UserDTO是一个类,只有Name和ID两个字段
输出结果:
True
Mac
说明了a和b就是同一个东西,这就是浅拷贝,究其原因,就是类是引用类型,而不是值类型
那怎么浅拷贝做成深拷贝的效果呢?
有三个方法(参见:https://www.cnblogs.com/TheBob/p/9414014.html):
上代码,这两个方法都可以:
//方法一
public static void DeepCopy<T>(T _raw,T _toObj)where T:class { Type type = _raw.GetType(); object o = Activator.CreateInstance(type); PropertyInfo[] PI = type.GetProperties(); for (int i = 0; i < PI.Length; i++) { PropertyInfo P = PI[i]; P.SetValue(o, P.GetValue(_raw)); } _toObj = o as T; return; }
//方法二 public static T DeepCopy<T>(T _raw) { Type type = _raw.GetType(); object o = Activator.CreateInstance(type); PropertyInfo[] PI = type.GetProperties(); for (int i = 0; i < PI.Length; i++) { PropertyInfo P = PI[i]; P.SetValue(o, P.GetValue(_raw)); } return (T)o; }