C# 中的深拷贝和浅拷贝

1
2
3
4
5
6
7
8
public GoodItem CloneItem()
{
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, this);
stream.Position = 0;
return formatter.Deserialize(stream) as GoodItem;
}

2.利用xml序列化和反序列化实现

1
2
3
4
5
6
7
8
9
10
11
public T DeepCopy<T>(T obj)
{
object retval;
MemoryStream ms = new MemoryStream()
XmlSerializer xml = new XmlSerializer(typeof(T));
xml.Serialize(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
retval = xml.Deserialize(ms);
ms.Close();
return (T)retval;
}

3.利用反射实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static T DeepCopy<T>(T obj)
{
//如果是字符串或值类型则直接返回
if (obj is string || obj.GetType().IsValueType) return obj;

object retval = Activator.CreateInstance(obj.GetType());
FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
foreach (FieldInfo field in fields)
{
try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }
catch { }
}
return (T)retval;
}