2012-05-11 2 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을 시도했지만 작동하지 않았습니다.

참고 :이 VM은 나중에 WebApi에서 사용되며 JSON.NET에서는 컬렉션을 정리하는 데 필요한 래퍼가 필요합니다. 따라서 래퍼를 제거하는 것은 해결책이 아닙니다.

참고 2 : 또한 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

관련 문제