簡體   English   中英

將對象復制到對象(使用 Automapper ?)

[英]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將接收person2Brain實例的成員值。 那就是你有一個深拷貝
但是,如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM