将对象复制到对象(使用Automapper?)

我有一个class级:

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

我有Person(person1和person2)的两个实例。 我想将person2的内容复制到person1。 我想在一个指令中做这个副本,而不是按财产:

 person1.LastName = person2.LastName; 

在文档中,我看到复制一个对象到另一个对象,但types是不同的。 如何在types相同的情况下复制对象?

根据我的理解,OP不想将person2克隆到Person的新实例中,而是要求如何将Person2的内容复制到Person的 现有实例person1 )中。 有一个AutoMapper的Mapper.Map方法的重载,为你做这个:

 Mapper.CreateMap<Person, Person>(); Mapper.Map<Person, Person>(person2, person1); //This copies member content from person2 into the _existing_ person1 instance. 

注1: @ alexl的答案创build了Person实例。 如果您还有其他人员指向的实例的引用,那么如果将person1variablesredirect到新的实例,则这些引用不会获得(可能是)期望的数据更新。

注2:您需要注意(recursion)复制深度取决于映射时AutoMapper知道的映射!
如果Person类的成员是Brain类,并且您还完成了Mapper.CreateMap<Brain, Brain>(); 复制数据之前Mapper.Map<Person, Person>(person2, person1); 那么person1将保留当前的Brain实例,但是这个Brain将会收到person2Brain实例的成员值。 这是你有一个深刻的副本
但是如果AutoMapper在复制之前没有Brain-Brain映射,那么person1Brain成员将引用与一个person2引用相同的Brain实例。 那就是你会得到一个浅的副本
这将recursion地应用于所有成员,所以最好确保AutoMapper具有要深度复制的成员类的映射,并且没有要对其进行浅拷贝的成员类的映射。

使用AutoMapper的替代方法是使用reflection的方法 。 (注意链接中的代码做了一个拷贝!)

AutoMapper版本0.2中添加了 “支持填充现有对象,而不是自动创build目标对象的AutoMapper”。

既然你问了With Automapper? 我可以build议你不要使用AutoMapper?

而是在Clone方法中使用MemberwiseClone() ,例如

 public class Person { public string FirstName { get; set; } public string LastName { get; set; } public Person Clone() { return (Person) MemberwiseClone(); } } 

UPDATE

重要的是要注意这一点,并没有让原来的海报person1 person2复制 person2

然而(正如@Jimmy Bogard指出的),如果你只需要创build一个对象的副本 (克隆),那么使用MemberwiseClone()是首选。

例如,如果你这样做:

 //I need a copy of person1 please! I'll make a new person object //and automapper everything into it! var person2 = new Person2(); Mapper.Map<Person, Person>(person1, person2) 

那么你真的应该/可以使用

 //oh wait, i can just use this! var person2 = person1.Clone() 
 Mapper.CreateMap<Person, Person>(); // Perform mapping var person1 = Mapper.Map<Person, Person>(person2); 

希望这可以帮助。

为什么你想使用Automapper呢? 一个简单的克隆会为你做这个工作。

在这里阅读更多: 深入克隆对象