Clearing primary keys after deep cloning an object
我有以下linq-to-sql对象(例如)
1 2 3 4 5 6 7 8 9 10 | class Parent{ int id; // primary key IEnumerable<Child> children; } class Child{ int id; // primary key string field1; int field2; } |
我需要深度克隆一个
我已经使用这种方法进行了克隆,但是我正在寻找一种优雅的方法来迭代父对象和子对象属性(假设可能有大量子对象,层叠深度远远超过1级),并将它们的主键设置为0,以便当我将克隆的对象提交到数据库时,Linq to SQL会处理这些问题。创造新的孩子。
你可以试试以下的方法:用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public static T DeepCopy<T>(this T parent) where T : new() { var newParent = new T(); foreach (FieldInfo p in typeof(T).GetFields()) { if (p.Name.ToLower() !="id") p.SetValue(newParent, p.GetValue(parent)); else p.SetValue(newParent, 0); if (p.FieldType.IsGenericType && p.FieldType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) { dynamic children = p.GetValue(parent); dynamic newChildren = p.GetValue(parent); for (int i = 0; i < children.Length; i++) { var newChild = DeepCopy(children[i]); newChildren.SetValue(newChild, i); } } } return newParent; } |