2016-01-19 139 views
3

我有以下類。如何將嵌套對象映射到現有的嵌套對象?

public class Person { 
    public string Name { get; set; } 
    public Address Address { get; set; } 
} 

public class PersonDTO { 
    public string Name { get; set; } 
    public Address Address { get; set; } 
} 

我創建使用

Mapper.CreateMap<Person, PersonDTO>(); 

標準映射然後我想一個Person映射到那樣的現有PersonDTO層次,現有的Address將被更新,而不是參考,如果你複製明白我的意思了嗎。

var person = new Person() { 
    Name = "Test", 
    Address = new Address() { 
    Country = "USA", 
    City = "New York" 
    } 
}; 
var personDTO = new PersonDTO() { 
    Name = "Test2", 
    Address = new Address() { 
    Country = "Canada", 
    City = "Ottawa" 
    } 
}; 

Mapper.Map(person, personDTO); 

我想完成下列測試。

Assert.AreNotEqual(person.Address, personDTO.Address); 
Assert.AreEqual(person.Address.Country, personDTO.Address.Country); 
Assert.AreEqual(person.Address.City, personDTO.Address.City); 

回答

1

只需創建Address和自身之間的映射是這樣的:

Mapper.CreateMap<Address, Address>(); 

請注意,下面的測試:

Assert.AreNotEqual(person.Address, personDTO.Address); 

可能不會使你想你想,如果Address定義Equals方法。根據我對這個問題的理解,你想檢查參考平等。

如果您使用的是NUnit,則應該使用Assert.AreNotSame

一般來說,你可以使用object.ReferenceEquals檢查這樣的參考平等:

bool same_object = object.ReferenceEquals(person.Address, personDTO.Address); 
+0

謝謝你,我會嘗試。這個斷言只是一種假象 - 指示,儘管感謝提示。 –

+0

是的,這很好用,謝謝。然而,在現實世界中,爲了簡單起見,我使用了'DynamicMap',並且明確定義所有這些自映射將需要大量的樣板代碼。沒有任何一種隱含的方式使這種行爲成爲默認的方式嗎?或者我可以創建自己的方法,試圖將'CreateMissingTypeMaps'用於嵌套映射嗎? –

+1

我沒有辦法知道。但也許有一個。考慮發佈一個關於這個問題。 –