参考链接:https://www.cnblogs.com/bobositlife/articles/ways-of-deep-cloning-objects-in-csharp.html
.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法
.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法,总有一种适合你。
方式一 使用二进制流
using System;using System.IO;using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;/// <summary>/// 参考 http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx/// </summary>public static class ObjectCopier{public static T Clone<T>(T source){if (!typeof(T).IsSerializable){throw new ArgumentException("The type must be serializable.", "source");}if (Object.ReferenceEquals(source, null)){return default(T);}IFormatter formatter = new BinaryFormatter();Stream stream = new MemoryStream();using (stream){formatter.Serialize(stream, source);stream.Seek(0, SeekOrigin.Begin);return (T)formatter.Deserialize(stream);}}}
方式二 使用序列化与反序列化
public static T CloneJson<T>(this T source){if (Object.ReferenceEquals(source, null)){return default(T);}var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings);}
方式三 使用反射
public static T DeepCopyByReflect<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, DeepCopyByReflect(field.GetValue(obj))); }catch { }}return (T)retval;}
方式四 使用XML序列化与反序列化
public static T DeserializeXML<T>(string xmlData) where T:new(){if (string.IsNullOrEmpty(xmlData))return default(T);TextReader tr = new StringReader(xmlData);T DocItms = new T();XmlSerializer xms = new XmlSerializer(DocItms.GetType());DocItms = (T)xms.Deserialize(tr);return DocItms == null ? default(T) : DocItms;}
来源于 图享网 -> 《.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法》
——————————————————————————
专注.NET开发的爱好者知识社区—【https://codedefault.com】。
