2016-01-19 7 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

Не знаю, о чем я знаю. Но, возможно, есть один. Подумайте о том, чтобы задать вопрос об этом. –

Смежные вопросы