[英]Copy object to object (with Automapper ?)
我有一堂課:
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沒有復制前有腦腦圖,然后PERSON1的腦成員將引用相同的大腦實例作為一個PERSON2引用。 那就是你會得到一個淺拷貝。
這將遞歸地應用於所有成員,因此您最好確保 AutoMapper 具有要深復制的成員類的映射,並且沒有要淺復制的成員類的映射。
使用 AutoMapper 的替代方法是使用使用反射的方法。 (請注意,鏈接中的代碼是淺拷貝!)
AutoMapper 0.2 版中添加了“支持填充現有對象,而不是 AutoMapper 創建目標對象本身”。
既然你問了With Automapper?
我可以建議您不要使用 AutoMapper 嗎?
而是在Clone
方法中使用MemberwiseClone()
,例如
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Person Clone()
{
return (Person) MemberwiseClone();
}
}
更新
重要的是要注意這並不能實現原始海報將person1
復制到person2
但是,(正如@Jimmy Bogard 指出的那樣)如果您只需要制作對象的副本(克隆),則首選使用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 中,您不能使用靜態AutoMapper.Mapper.Map
方法。 相反,像這樣初始化一個新的映射器:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Person, Person>();
});
var mapper = new Mapper(config);
var clone = mapper.Map<Person>(person);
通常,您希望在Startup.cs
文件中注冊映射器進行依賴注入,並將其注入您的業務類中:
public void ConfigureServices(IServiceCollection services)
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Person, Person>();
});
var mapper = new Mapper(config);
services.AddSingleton(mapper);
// ...
}
重要提示:不要在實體類中創建或注入映射器!
當然,在簡單的情況下,您應該更喜歡使用MemberwiseClone()
。
為什么要為此使用 Automapper? 一個簡單的克隆可以為您完成這項工作。
在此處閱讀更多信息: 深度克隆對象
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.