[Reflection]在C#中處理深度複製 Deep Copy

  • 5650
  • 0
  • C#
  • 2018-04-08

在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