gpt4 book ai didi

c# - 深度克隆对象后清除主键

转载 作者:行者123 更新时间:2023-11-30 17:04:15 25 4
gpt4 key购买 nike

我有以下 LINQ to SQL 对象(例如)

class Parent{
int id; // primary key
IEnumerable<Child> children;
}

class Child{
int id; // primary key
string field1;
int field2;
}

我需要深度克隆一个 Parent 并将其保存到数据库中,但要包含子项的副本,即不引用现有的子项。

我用过this method进行克隆,但我正在寻找一种优雅的方式来遍历父级和子级属性(假设可能有大量子对象,级联深度远远超过 1 级)和 < strong>将它们的主键设置为 0,这样当我将克隆的对象提交到数据库时,LINQ to SQL 会负责创建新的子对象。

最佳答案

您可以尝试以下使用 System.Reflection 的扩展方法:

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;
}

关于c# - 深度克隆对象后清除主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17718155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com