将对象复制到对象(使用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将会收到person2的Brain实例的成员值。 这是你有一个深刻的副本 。
但是如果AutoMapper在复制之前没有Brain-Brain映射,那么person1的Brain成员将引用与一个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呢? 一个简单的克隆会为你做这个工作。
在这里阅读更多: 深入克隆对象