我有一个类:
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
我有两个Person实例(person1和person2)。我想将person2的内容复制到person1。我想在一个指令中制作此副本,并按属性创建而不是属性:
person1.LastName = person2.LastName;
在文档中,我看到将一个对象复制到另一个对象,但是类型不同。类型相同时如何复制对象?
最佳答案
据我所知,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的答案将创建Person的新实例。如果您对person1指向的实例有其他引用,那么如果将person1变量重定向到新实例,这些引用将不会(大概)获得所需的数据更新。
注2:您需要注意,(递归)复制深度取决于AutoMapper在映射时知道的映射!
如果Person类的成员属于Brain类,并且您另外在复制数据
Mapper.CreateMap<Brain, Brain>();
调用之前完成了Mapper.Map<Person, Person>(person2, person1);
,则person1将保留其当前Brain实例,但是此Brain将接收person2的Brain实例的成员值。那就是您有一个深度副本。但是,如果AutoMapper在复制之前没有Brain-Brain映射,则person1的Brain成员将引用与person2引用的同一Brain实例。那就是您将得到一个浅拷贝。
这将递归地应用于所有成员,因此您最好确保AutoMapper具有要深度复制的成员类的映射,而没有要深度复制的成员类的映射。
使用AutoMapper的替代方法是使用an approach using reflection。 (请注意,链接中的代码会进行浅拷贝!)
“added in AutoMapper version 0.2表示支持填充现有对象,而不是由AutoMapper自己创建目标对象。”