E:\0_RG\Code\RG6.PF\rg3-pf\RG3.PF.Abstractions\Entity\EntityBasis.cs
在 .NET Core 中,可以使用以下几种方法进行对象深度克隆:
使用序列化和反序列化 .netcore 7开始被标记过期
利用 .NET Core 中的二进制序列化和反序列化功能,将对象序列化为字节数组,再将其反序列化为新的对象,从而实现对象的深度克隆。
示例代码:
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public static T DeepClone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
/// <summary>
/// 深度克隆对象
/// </summary>
/// <returns>The clone.</returns>
/// <param name="o">克隆源</param>
private object Clone(object o)
{
object obj = null;
if (o == null)
return obj;
//将对象序列化成内存中的二进制流
BinaryFormatter inputFormatter = new BinaryFormatter();
MemoryStream inputStream;
using (inputStream = new MemoryStream())
{
inputFormatter.Serialize(inputStream, o);
}
//将二进制流反序列化为对象
using (MemoryStream outputStream = new MemoryStream(inputStream.ToArray()))
{
BinaryFormatter outputFormatter = new BinaryFormatter();
obj = outputFormatter.Deserialize(outputStream);
}
return obj;
}
使用反射
使用反射机制获取对象的类型信息,并通过递归调用实现对象的深度克隆。
示例代码:
using System;
using System.Reflection;
public static T DeepClone<T>(T obj)
{
if (obj == null) return default(T);
Type type = obj.GetType();
if (type.IsValueType || type == typeof(string))
{
return obj;
}
object clone = Activator.CreateInstance(type);
foreach (FieldInfo field in type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
{
object fieldValue = field.GetValue(obj);
if (fieldValue == null) continue;
field.SetValue(clone, DeepClone(fieldValue));
}
return (T)clone;
}
使用第三方库
除了上述方法,还可以使用一些第三方库进行对象深度克隆,比如 AutoMapper、FastDeepCloner 等,这些库都提供了方便的 API 和高效的克隆方法。
文档更新时间: 2023-07-17 13:44 作者:admin