C#深度拷贝函数,不改变原有赋值对象

代码如下

using System;

// 复用之前的InkLimitModel类和深拷贝工具
public class InkLimitModel
{
    [JsonProperty("mode")]
    public string Mode { get; set; }
    [JsonProperty("index", NullValueHandling = NullValueHandling.Ignore)]
    public int? Index { get; set; }
    [JsonProperty("inkName", NullValueHandling = NullValueHandling.Ignore)]
    public string InkName { get; set; }
    [JsonProperty("maxInk", NullValueHandling = NullValueHandling.Ignore)]
    public float? MaxInk { get; set; }
    [JsonProperty("singleGamma", NullValueHandling = NullValueHandling.Ignore)]
    public float? SingleGamma { get; set; }
    [JsonProperty("linear", NullValueHandling = NullValueHandling.Ignore)]
    public float?[] Linear { get; set; }
}

// 深拷贝工具类(复用之前的实现)
public static class DeepCopyHelper
{
    public static T DeepCopy<T>(this T obj) where T : class, new()
    {
        if (obj == null) return null;
        return (T)CopyObject(obj);
    }

    private static object CopyObject(object obj)
    {
        if (obj == null) return null;
        Type type = obj.GetType();

        if (type.IsValueType || type == typeof(string))
            return obj;

        if (type.IsArray)
        {
            Array originalArray = (Array)obj;
            Array newArray = Array.CreateInstance(type.GetElementType(), originalArray.Length);
            for (int i = 0; i < originalArray.Length; i++)
                newArray.SetValue(CopyObject(originalArray.GetValue(i)), i);
            return newArray;
        }

        object copy = Activator.CreateInstance(type);
        foreach (var prop in type.GetProperties())
        {
            if (prop.CanRead && prop.CanWrite)
                prop.SetValue(copy, CopyObject(prop.GetValue(obj)));
        }
        return copy;
    }
}

// 数组拷贝扩展方法(专门处理数组)
public static class ArrayExtensions
{
    // 深度拷贝数组:创建新数组 + 每个元素深拷贝
    public static T[] DeepCopyArray<T>(this T[] source) where T : class, new()
    {
        if (source == null) return null;

        T[] newArray = new T[source.Length];
        for (int i = 0; i < source.Length; i++)
        {
            // 对每个元素进行深拷贝
            newArray[i] = source[i]?.DeepCopy();
        }
        return newArray;
    }
}

// 使用示例
public class Program
{
    // 修改数组元素的函数
    public static void ChangeRipArray(ref InkLimitModel[] models)
    {
        // 修改数组第一个元素
        models[0].Mode = "new";
        models[0].MaxInk = 90.0f;
        // 修改数组元素中的数组
        if (models[0].Linear != null)
            models[0].Linear[0] = 0.5f;
    }

    public static void Main()
    {
        // 初始化原数组a
        InkLimitModel[] a = new InkLimitModel[]
        {
            new InkLimitModel
            {
                Mode = "edit",
                Index = 0,
                Linear = new float?[] { 0.0f, 0.1f }
            },
            new InkLimitModel
            {
                Mode = "edit",
                Index = 1
            }
        };

        // 关键:数组深度拷贝(新数组 + 元素深拷贝)
        InkLimitModel[] b = a.DeepCopyArray();

        // 修改b数组
        ChangeRipArray(ref b);

        // 验证a不受影响
        Console.WriteLine(a[0].Mode); // 输出 "edit"(未变)
        Console.WriteLine(a[0].Linear[0]); // 输出 0.0f(未变)
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值