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

我没有办法知道。但也许有一个。考虑发布一个关于这个问题。 –