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