参考链接:https://www.cnblogs.com/bobositlife/articles/ways-of-deep-cloning-objects-in-csharp.html

.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法

.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法,总有一种适合你。

方式一 使用二进制流

  1. using System;
  2. using System.IO;
  3. using System.Runtime.Serialization;
  4. using System.Runtime.Serialization.Formatters.Binary;
  5. /// <summary>
  6. /// 参考 http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx
  7. /// </summary>
  8. public static class ObjectCopier
  9. {
  10. public static T Clone<T>(T source)
  11. {
  12. if (!typeof(T).IsSerializable)
  13. {
  14. throw new ArgumentException("The type must be serializable.", "source");
  15. }
  16. if (Object.ReferenceEquals(source, null))
  17. {
  18. return default(T);
  19. }
  20. IFormatter formatter = new BinaryFormatter();
  21. Stream stream = new MemoryStream();
  22. using (stream)
  23. {
  24. formatter.Serialize(stream, source);
  25. stream.Seek(0, SeekOrigin.Begin);
  26. return (T)formatter.Deserialize(stream);
  27. }
  28. }
  29. }

方式二 使用序列化与反序列化

  1. public static T CloneJson<T>(this T source)
  2. {
  3. if (Object.ReferenceEquals(source, null))
  4. {
  5. return default(T);
  6. }
  7. var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};
  8. return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings);
  9. }

方式三 使用反射

  1. public static T DeepCopyByReflect<T>(T obj)
  2. {
  3. //如果是字符串或值类型则直接返回
  4. if (obj is string || obj.GetType().IsValueType) return obj;
  5. object retval = Activator.CreateInstance(obj.GetType());
  6. FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
  7. foreach (FieldInfo field in fields)
  8. {
  9. try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); }
  10. catch { }
  11. }
  12. return (T)retval;
  13. }

方式四 使用XML序列化与反序列化

  1. public static T DeserializeXML<T>(string xmlData) where T:new()
  2. {
  3. if (string.IsNullOrEmpty(xmlData))
  4. return default(T);
  5. TextReader tr = new StringReader(xmlData);
  6. T DocItms = new T();
  7. XmlSerializer xms = new XmlSerializer(DocItms.GetType());
  8. DocItms = (T)xms.Deserialize(tr);
  9. return DocItms == null ? default(T) : DocItms;
  10. }

来源于 图享网 -> 《.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法》
——————————————————————————
专注.NET开发的爱好者知识社区—【https://codedefault.com】。