2012-01-26 2 views
1

Мой текущий код работает:Automapper, отображение множества свойств в 1 ж/о 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 })); 
Смежные вопросы