2012-05-11 62 views
3

我有一些麻煩,試圖將這兩個類映射(控制 - > ControlVM)如何使用Automapper將集合映射到集合容器?

public class Control 
    { 
     public IEnumerable<FieldType> Fields { get; set; } 

     public class FieldType 
     { 
      //Some properties 
     } 
    } 


    public class ControlVM 
    { 
     public FieldList Fields { get; set; } 

     public class FieldList 
     { 
      public IEnumerable<FieldType> Items { get; set; } 
     } 

     public class FieldType 
     { 
      //Properties I'd like to map from the original 
     } 
    } 

我試着用opt.ResolveUsing(src => new { Items = src.Fields })但顯然AutoMapper無法解決匿名類型。也嘗試延長ValueResolver,但也沒有工作。

NOTE:該虛擬機稍後在WebApi中使用,並且JSON.NET需要對該集合進行封裝來正確地反序列化它。所以刪除包裝不是一個解決方案。

NOTE2:我也在做Mapper.CreateMap<Control.FieldType, ControlVM.FieldType>(),所以問題不在那裏。

回答

4

這個工作對我來說:

Mapper.CreateMap<Control.FieldType, ControlVM.FieldType>(); 

// Map between IEnumerable<Control.FieldType> and ControlVM.FieldList: 
Mapper.CreateMap<IEnumerable<Control.FieldType>, ControlVM.FieldList>() 
    .ForMember(dest => dest.Items, opt => opt.MapFrom(src => src)); 

Mapper.CreateMap<Control, ControlVM>(); 

更新:這裏是如何的其他方式映射:

Mapper.CreateMap<ControlVM.FieldType, Control.FieldType>(); 
Mapper.CreateMap<ControlVM, Control>() 
    .ForMember(dest => dest.Fields, opt => opt.MapFrom(src => src.Fields.Items)); 
+0

太好了!它也可以在沒有最後一個'CreateMap'的情況下工作(AutoMapper總是試圖映射具有相同名稱的屬性) – faloi

+0

@faloi:好點,我會把這個映射出去。 –

+0

你將如何執行逆映射? (ControlVM.FieldList - > IEnumerable )。 AutoMapper拋出「AutoMapper.AutoMapperConfigurationException:成員的自定義配置只支持頂級單個成員的類型。」 – faloi