我已经完成了很多关于在C#中复制/克隆对象的阅读,我试图从this example开始工作,但我的情况有点不同。
我有一个从数据库返回的问题/答案对列表。我想用它来为父对象和子对象创建两个列表。当我这样做时,我对孩子所做的任何改变都反映在父母身上。
我尝试了几种创建新列表,克隆等的排列方式,但总是得到相同的结果。
List<QuestionVM> questionlist = productRepository.GetQuestions();
parent.Questions = AddQuestions(true, parent, questionlist);
child.Questions = AddQuestions(false, child, questionlist);
private List<QuestionVM> AddQuestions(bool parent, Line line, List<QuestionVM> questions)
{
//shouldn't this create a new object, not just a reference?
List<QuestionVM> qs = new List<QuestionVM>(questions);
if (parent)
{
return qs.Where(w => w.ShowOnParent).ToList();
}
else
{
return qs.ToList();
}
}
非常感谢任何帮助。
答案 0 :(得分:2)
仅创建列表副本是不够的,因为旧列表和新列表中的项目仍将引用相同的对象。
您need to为您的对象实现了ICloneable界面(或只是您自己的custom method),并在创建副本列表时为每个原始对象调用克隆:
public class QuestionVM: ICloneable
{
public Object Clone()
{
return new QuestionVM(this.prop1, this.prop2);
}
}
...
private List<QuestionVM> AddQuestions(bool parent, Line line, List<QuestionVM> questions)
{
...
return qs
.Where(w => w.ShowOnParent)
.Select(obj => (VMQuestion)obj.Clone())
.ToList();
...
}
P.S。:如果VMQuestion
包含其他复杂类型的字段,那么他们也必须提供克隆方法。
答案 1 :(得分:0)
如果还有其他人对此感兴趣。您可以使用自动映射器对对象进行深度复制。