1:利用反射实现
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;
}
2:利用xml序列化和反序列化实现
public t deepcopy<t>(t obj)
{
object retval;
using (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:利用二进制序列化和反序列化实现
public static t deepcopy<t>(t obj)
{
object retval;
using (memorystream ms = new memorystream())
{
binaryformatter bf = new binaryformatter();
//序列化成流
bf.serialize(ms, obj);
ms.seek(0, seekorigin.begin);
//反序列化成对象
retval = bf.deserialize(ms);
ms.close();
}
return (t)retval;
}
4:利用silverlight datacontractserializer实现,用于在silverlight 客户端使用
public static t deepcopy<t>(t obj)
{
object retval;
using (memorystream ms = new memorystream())
{
datacontractserializer ser = new datacontractserializer(typeof(t));
ser.writeobject(ms, obj);
ms.seek(0, seekorigin.begin);
retval = ser.readobject(ms);
ms.close();
}
return (t)retval;
补充:第一个已经通过递归实现了深拷贝。
更多c#中4种深拷贝方法介绍。