如何将对象列表从实体复制到另一个实体

时间:2011-12-21 11:18:56

标签: c# c#-4.0

我有一个名为Person的实体类。 Person实体有一个Asset实体列表。

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public IList<Asset> Assets { get; set;}
}

例如我有两个人(person1&amp; person2)。我需要将资产列表从person1复制到person2。我喜欢以下代码:

Person person1 = LoadById(1);
Person person2 = LoadById(2);

// person2.Assets = person1.Assets;   // Is it correct?

foreach(Asset item in person1.Assets)
{
    //person2.Assets.Add(item);
    Asset asset = new Asset();
    asset.Title = item.Title;
    asset.Description = item.Description;

    asset.Person = person2;        

    person2.Add(asset);
}    

person2.Update();

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

Assets属性是对列表的引用。 person2.Assets = person1.Assets;意味着他们共享并指向同一个列表,因此不会分开。

你想这样做:

person2.Assets = new List<Asset>(person1.Assets);

(只是要检查那个重载,但是应该复制所有的内容)......是的,应该这样做。

如果您想添加它们而不是替换它们,请使用:

person2.Assets.AddRange(person1.Assets);

但是,您可能会获得重复项。如果您不想这样做,可以执行此操作:Linq to entities : Unions + Distinct

此外,您还有一个() - 您的第一行应该是public class Person

答案 1 :(得分:0)

作为起点,我推荐MemberwiseClose method

的MSDN文档

这将使您的复制过程更具可读性。但请注意,这也只会创建列表的副本。

如果你真的需要一个副本,那么文章会建议这个策略:

  

如果有多种方法可以实现深层复制操作   由MemberwiseClone方法执行的浅复制操作   不符合你的需求。其中包括以下内容:

     
      
  • 调用要复制的对象的类构造函数,以创建第二个对象,其属性值取自第一个对象。这个   假设对象的值完全由其类定义   构造

  •   
  • 调用MemberwiseClone方法创建对象的浅表副本,然后分配值与其对应的新对象   原始对象为其值为引用的任何属性或字段   类型。示例中的DeepCopy方法说明了这种方法。

  •   
  • 序列化要深度复制的对象,然后将序列化数据还原到其他对象变量。

  •   
  • 使用带递归的反射来执行深层复制操作。

  •