在C#中的複製有兩種
深度複製 (Deep Copy) 與淺層複製 (Shadow Copy)
這兩者到底是什麼意思 請大家Google一下便知道了
通常淺層複製是不需要關心的 難就難在深度複製
考慮以下情境
namespace MySample.Console
{
class Program
{
class ClassA
{
public int Id { get; set; }
public string Name { get; set; }
}
static void Main(string[] args)
{
var a = new List<ClassA>
{
new ClassA { Id = 1, Name = "A" },
new ClassA { Id = 2, Name = "B" },
};
//其實想要的是deep copy
var copyA = a;
}
}
}
通常你會覺得這並不難
首先這一定是個泛型函式、裡面是在做Reflection、並且Foreach取出Property、再重新組裝、最後回傳一個全新的實體 ( 如此才不是shadow copy )
但如果是這個例子呢?
namespace MySample.Console
{
class Program
{
class ClassA
{
public int Id { get; set; }
public string Name { get; set; }
public ClassB Child { get; set; }
}
class ClassB
{
public int Id { get; set; }
public string Name { get; set; }
public List<ClassC> Children { get; set; }
}
class ClassC
{
public int Id { get; set; }
public string Name { get; set; }
}
static void Main(string[] args)
{
var a = new List<ClassA>
{
new ClassA { Id = 1, Name = "A",
Child = new ClassB {
Id = 2, Name = "B",
Children = new List<ClassC> {
new ClassC { Id = 3, Name = "C1" },
new ClassC { Id = 4, Name = "C2" },
}
}
}
};
//其實想要的是deep copy
var copyA = a;
}
}
}
OK 這時後我們應該就不會第一直覺準備開始打開VS寫Code了
來! 秉持我們Google得到絕不自己寫的原則
Burtsev-Alexey 的 net-object-deep-copy 是一個寫得很好的例子
https://github.com/Burtsev-Alexey/net-object-deep-copy/blob/master/ObjectExtensions.cs