public void DeepCloneTest(DeepCloneMethod method) { Where(); DeepClone_ConstructorCount = 0; RootClass a = new RootClass(); a.Int1 = Util.RandSInt31(); a.Str1 = a.Int1.ToString(); a.Test1 = new ElementClass2("Hello"); a.Test2 = new ElementClass2("Hello"); a.Test3 = a.Test2; a.Test1.TestList = new List <ElementClass2>(); a.Test1.TestList.Add(a.Test2); a.Test2.TestList = new List <ElementClass2>(); a.Test2.TestList.Add(a.Test1); int tmp = Util.RandSInt31(); a._GetFieldReaderWriter(true).SetValue(a, "Int2", tmp); a._GetFieldReaderWriter(true).SetValue(a, "Str2", tmp.ToString()); a.Dict = new Dictionary <int, ElementClass>(); a.Element = new ElementClass { Int1 = 1, Str1 = "Hello", Root = null }; a.Element.Element2 = new ElementClass2("Neko"); for (int i = 0; i < 1000; i++) { ElementClass e = new ElementClass(); e.Int1 = Util.RandSInt31(); e.Str1 = e.Int1.ToString(); e._GetFieldReaderWriter(true).SetValue(e, "Int2", tmp); e._GetFieldReaderWriter(true).SetValue(e, "Str2", tmp.ToString()); e.Root = a; a.Dict.Add(i, e); } DeepClone_ConstructorCount = 0; RootClass b = a._CloneDeep(method); Assert.False(object.ReferenceEquals(b.Test1, b.Test2)); Assert.True(object.ReferenceEquals(b.Test2, b.Test3)); Assert.True(object.ReferenceEquals(b.Test1 !.TestList ![0], b.Test2));