列表<t>从同一对象复制,在两个地方都更新了属性</t>

时间:2015-04-10 17:46:03

标签: c#

我已经完成了很多关于在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(); 
    }
}

非常感谢任何帮助。

2 个答案:

答案 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)

如果还有其他人对此感兴趣。您可以使用自动映射器对对象进行深度复制。