Каждый экземпляр cls2 представляет собой адрес, а также некоторую другую информацию. Каждый экземпляр cls1 имеет набор адресов. Таким образом, невозможно будет отображать непосредственно из cls1 в cls2, если вы не предполагаете, что в каждом экземпляре cls1 имеется только один адрес.
Чтобы преодолеть это, сопоставьте один cls1 с несколькими cls2, введя денормализованный объект, который представляет адрес и его родительский cls1. Тогда отображение может быть от денормализованного представления до cls2.
public class Cls1AndAddress
{
public Cls1 Cls1;
public Address Address;
}
[Test]
public void DenormalizationApproach()
{
AutoMapper.Mapper.CreateMap<Cls1AndAddress, Cls2>()
.ForMember(dest => dest.Prop1, opt => opt.MapFrom(src => src.Cls1.Name))
.ForMember(dest => dest.Street, opt => opt.MapFrom(src => src.Address.Street))
.ForMember(dest => dest.HouseNumber, opt => opt.MapFrom(src => src.Address.HouseNumber))
;
var c1 = new Cls1
{
Addresses = new List<Address>
{
new Address {Street = "foo", HouseNumber = 1},
new Address {Street = "bar", HouseNumber = 2},
}
};
var denormalized = c1.Addresses.Select(address => new Cls1AndAddress {Cls1 = c1, Address = address});
var c2 = AutoMapper.Mapper.Map<IEnumerable<Cls1AndAddress>, IEnumerable<Cls2>>(denormalized);
var c2Array = c2.ToArray();
Assert.AreEqual(2, c2Array.Length);
Assert.AreEqual("foo", c2Array[0].Street);
Assert.AreEqual("bar", c2Array[1].Street);
}
С другой стороны, если есть только один адрес в cls1, вы могли бы использовать более прямой путь взять на себя это в отображении:
[Test]
public void AssumeSingleApproach()
{
AutoMapper.Mapper.CreateMap<Cls1, Cls2>()
.ForMember(dest => dest.Street, opt => opt.MapFrom(src => src.Addresses.Single().Street))
.ForMember(dest => dest.HouseNumber, opt => opt.MapFrom(src => src.Addresses.Single().HouseNumber))
;
var c1 = new Cls1
{
Addresses = new List<Address>
{
new Address {Street = "foo", HouseNumber = 1},
// new Address {Street = "bar", HouseNumber = 2}, This would cause failure
}
};
var c2 = AutoMapper.Mapper.Map<Cls1, Cls2>(c1);
Assert.AreEqual(c2.Street, "foo");
}