2012-01-26 3 views
1
O를

내 현재 코드가 작동 승 1에 여러 속성을 매핑 :는 Automapper/ValueResolver

map.ForMember(x => x.Address, m => m.ResolveUsing(l => { 
    var engine = new MappingEngine((IConfigurationProvider)cfg); 
    var adress = engine.Map<AddressDto>(l.ContactInfo); 
    engine.Map(l.Address, adress); 
    return adress; 
})); 

을하지만 또 다른 방법이 될 줄 알았는데, 뭔가 같은 :

map.ForMember(x => x.Address, m => m.MapFrom(x => x.ContactInfo)); 
map.ForMember(x => x.Address, m => m.MapFrom(x => x.Address)); 

하지만 마지막 ForMember가 기존지도를 무시하는 것 같습니다.

Address 및 ContactInfo 속성을 ListDto.Address의 단일 개체에 결합하려고합니다.

void Main() 
{ 
    var map = Mapper.CreateMap<Listing, ListingDto>(); 
    var cfg = Mapper.Configuration; 
    map.ForMember(x => x.Address, m => m.ResolveUsing(l => { 
     var engine = new MappingEngine((IConfigurationProvider)cfg); 
     var adress = engine.Map<AddressDto>(l.ContactInfo); 
     engine.Map(l.Address, adress); 
     return adress; 
    })); 

    Mapper.CreateMap<Address, AddressDto>() 
    .ForMember(x => x.Latitude, x => x.Ignore()); 
    Mapper.CreateMap<ContactInfo, AddressDto>() 
    .ForMember(x => x.Street, x=> x.Ignore()); 

    Mapper.Map<ListingDto>(new Listing{ 
    Name="Foo", 
    Address = new Address{Street = "Street"}, 
    ContactInfo = new ContactInfo{ Latitude = "latitude"}}).Dump(); 
} 

// Define other methods and classes here 
public class Listing{   
    public string Name { get; set; } 
    public Address Address { get; set; } 
    public ContactInfo ContactInfo {get;set;} 
} 

public class ContactInfo{ 
    public string Latitude {get;set;} 
} 
public class Address{ 
    public string Street {get;set;} 
} 


public class AddressDto{ 
    public string Latitude {get;set;} 
    public string Street {get;set;} 
} 

public class ListingDto{ 
    public string Name { get; set; } 
    public AddressDto Address {get;set;} 
} 

.Dump() <이 - linqpad에서 출력하는 것입니다

답변

5

이런 식으로 뭔가 작업을해야합니다 :

.ForMember(x => x.Address, o => o.MapFrom(
    s => new AddressDto { 
     Latitude = s.ContactInfo.Latitude, 
     Street = s.Address.Street }));