2013-08-08 1 views
0

AutoMapper 2.2.1을 사용하여 다른 비즈니스 개체를 모델을 매핑하는 데 사용하고 있습니다. 이제 CustomList (아래 코드 참조) 속성을 가진 개체를 매핑하려고하면 InvalidCastExceptions이 표시됩니다. CustomListIList으로 캐스팅 할 수 없다는 예외가 있습니다. CustomListIReadOnlyList을 구현하고 IList이 아니기 때문에 어느 쪽이 옳습니다.매핑시 MyType이 MyType에 매핑되는 동안 InvalidCastException이 발생했습니다.

automapper가 이런 방식으로 파일을 캐스팅하려고하는 이유와이를 해결하는 방법/해결 방법은 무엇입니까? 대부분 문제의 원인이되는 클래스가 IReadOnlyList에서 구현하는 데

public class MyViewModel : SomeModel { //... some addtional stuff ...} 

public class SomeModel { 
public CustomList DescriptionList { get; internal set; } 
} 

public class CustomList : ReadOnlyList<SomeOtherModel> {} 

public abstract class ReadOnlyList<TModel> : IReadOnlyList<TModel> {} 

//map it 
//aList is type of SomeModel 
var viewList = Mapper.Map<List<MyViewModel>>(aList); 

답변

2

:

나는 이러한 유형이있다. Automapper는 읽기 전용 목록을 읽기 전용 목록에 매핑하는 방법을 모릅니다. 개체의 새 인스턴스를 만들고 IReadOnlyList에 대한 추가 메서드 또는 컬렉션 이니셜 라이저가 없습니다. Automapper는 읽기 전용 목록이 래핑하는 기본 목록에 액세스 할 수 있어야합니다. 이 작업은 ConstructUsing 메서드를 사용하여 수행 할 수 있습니다.

업데이트 목록 모델 :

public class CustomList : IReadOnlyList<string> 
{ 
    private readonly IList<string> _List; 

    public CustomList (IList<string> list) 
    { 
     _List = list; 
    } 

    public CustomList() 
    { 
     _List = new List<string>(); 
    } 

    public static CustomList CustomListBuilder(CustomList customList) 
    { 
     return new CustomList (customList._List); 
    } 
} 

업데이트 automapper 설정

Mapper.CreateMap<CustomList, CustomList>().ConstructUsing(CustomList.CustomListBuilder); 

이 간단한 예입니다하지만 제대로뿐만 아니라 던지지대로지도를 얻을 수 있었다 예외. 이것은 최상의 코드는 아니며, 이렇게하면 동일한 목록이 두 개의 다른 읽기 전용 목록 (사용자 요구 사항에 따라 다르거 나 그렇지 않을 수도 있음)에 의해 참조 될 수 있습니다. 잘하면이 도움이됩니다.

+0

'ReadOnlyList'로 인해 문제가 발생했습니다. 나는 너무 깨끗한 해결책으로 그것을 고쳤다. ViewModel 내부의 ReadOnlyList 멤버를'new'로 덮어 쓰고 숨 깁니다. 이런 식으로 리턴 타입을 변경하는 것은 깨끗해야합니다. – Andreas