1、使用MemoryStream流及xml序列化/反序列化,实现深拷贝引用类型变量
public static T DeepCopyXML<T>(this T obj)
{
object retval;
using (MemoryStream ms = new())
{
XmlSerializer xml = new(typeof(T));
xml.Serialize(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
retval = xml.Deserialize(ms);
ms.Close();
}
return (T)retval;
}
2、 使用JSON序列化/反序列化
public static T DeepCopyJson<T>(this T obj)
{
string json = JsonSerializer.Serialize(obj);
return JsonSerializer.Deserialize<T>(json);
}
测试代码及结果如下:
DeepCopy original = new DeepCopy()
{
ID = 1,
Name = "Tom",
List = new List<string>() { "1", "2", "3" },
};
Console.WriteLine("Original: ");
Console.WriteLine($"ID: {original.ID}");
Console.WriteLine($"Name: {original.Name}");
Console.WriteLine($"List: {string.Join(", ", original.List)}");
Console.WriteLine("-------------------------------------------------");
//深拷贝
DeepCopy deepCopyXML = DeepCopy.DeepCopyXML(original);
deepCopyXML.ID = 2;
deepCopyXML.Name = "Jerry";
deepCopyXML.List[0] = "4";
Console.WriteLine("XMLCopy: ");
Console.WriteLine($"ID: {deepCopyXML.ID}");
Console.WriteLine($"Name: {deepCopyXML.Name}");
Console.WriteLine($"List: {string.Join(", ", deepCopyXML.List)}");
Console.WriteLine("-------------------------------------------------");
DeepCopy deepCopyJson = DeepCopy.DeepCopyJson(original);
deepCopyJson.ID = 3;
deepCopyJson.Name = "Jack";
deepCopyJson.List[0] = "5";
Console.WriteLine("JsonCopy: ");
Console.WriteLine($"ID: {deepCopyJson.ID}");
Console.WriteLine($"Name: {deepCopyJson.Name}");
Console.WriteLine($"List: {string.Join(", ", deepCopyJson.List)}");
Console.WriteLine("-------------------------------------------------");
//原始对象
Console.WriteLine("Original: ");
Console.WriteLine($"ID: {original.ID}");
Console.WriteLine($"Name: {original.Name}");
Console.WriteLine($"List: {string.Join(", ", original.List)}");
Console.WriteLine("-------------------------------------------------");