C#中4种深拷贝方法介绍
1:利用反射实现
publicstaticTDeepCopy<T>(Tobj)
{
//如果是字符串或值类型则直接返回
if(objisstring||obj.GetType().IsValueType)returnobj;
objectretval=Activator.CreateInstance(obj.GetType());
FieldInfo[]fields=obj.GetType().GetFields(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.Static);
foreach(FieldInfofieldinfields)
{
try{field.SetValue(retval,DeepCopy(field.GetValue(obj)));}
catch{}
}
return(T)retval;
}
2:利用xml序列化和反序列化实现
publicTDeepCopy<T>(Tobj)
{
objectretval;
using(MemoryStreamms=newMemoryStream())
{
XmlSerializerxml=newXmlSerializer(typeof(T));
xml.Serialize(ms,obj);
ms.Seek(0,SeekOrigin.Begin);
retval=xml.Deserialize(ms);
ms.Close();
}
return(T)retval;
}
3:利用二进制序列化和反序列化实现
publicstaticTDeepCopy<T>(Tobj)
{
objectretval;
using(MemoryStreamms=newMemoryStream())
{
BinaryFormatterbf=newBinaryFormatter();
//序列化成流
bf.Serialize(ms,obj);
ms.Seek(0,SeekOrigin.Begin);
//反序列化成对象
retval=bf.Deserialize(ms);
ms.Close();
}
return(T)retval;
}
4:利用silverlightDataContractSerializer实现,用于在silverlight客户端使用
publicstaticTDeepCopy<T>(Tobj)
{
objectretval;
using(MemoryStreamms=newMemoryStream())
{
DataContractSerializerser=newDataContractSerializer(typeof(T));
ser.WriteObject(ms,obj);
ms.Seek(0,SeekOrigin.Begin);
retval=ser.ReadObject(ms);
ms.Close();
}
return(T)retval;
补充:第一个已经通过递归实现了深拷贝。