代码如下
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(未变)
}
}