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;
补充:第一个已经通过递归实现了深拷贝。