2011-04-28 2 views
9

주어진 다음의 소스 유형 :Automapper가 자동으로 올바른 하위 클래스를 매핑하여?

public class BaseViewModel 
{ 
    public string Prop1 { get; set; } 
} 

public class FirstViewModelImpl : BaseViewModel 
{ 
    public string Prop2 { get; set; } 
} 

public class SecondViewModelImpl : BaseViewModel 
{ 
    public string AnotherProp { get; set; } 
} 

그리고 다음과 같은 대상 유형을 다음과 같은 매핑으로

public class BaseDto 
{ 
    public string Prop1 { get; set; } 
} 

public class FirstDtoImpl : BaseDto 
{ 
    public string Prop2 { get; set; } 
} 

public class SecondDtoImpl : BaseViewModel 
{ 
    public string AnotherProp { get; set; } 
} 

:

Mapper.CreateMap<FirstViewModelImpl,FirstDtoImpl>(); 
Mapper.CreateMap<SecondViewModelImpl,SecondDtoImpl>(); 

가 나는 다음 (사소한 예)를 할 수 - 부여 런타임까지 뷰 모델의 유형을 실제로 알지 못합니다.

BaseViewModel myViewModel = GetAViewModelFromSomewhere(); 
FirstDtoImpl dto = (FirstDtoImpl)Mapper.Map<BaseViewModel,BaseDto>(myViewModel); 

지금은 어쨌든 시도하고 있습니다!

+0

맞아요. 저는 이걸 시도해 보았습니다. 불가능한 것처럼 보입니다. –

답변

18

나는 그런

Mapper.CreateMap<BaseViewModel,BaseDto>() 
     .Include<FirstViewModelImpl,FirstDtoImpl>() 
     .Include<SecondViewModelImpl,SecondDtoImpl>(); 

Mapper.CreateMap<FirstViewModelImpl,FirstDtoImpl>(); 
Mapper.CreateMap<SecondViewModelImpl,SecondDtoImpl>(); 

에 매핑을 변경할 경우이 형식 변환기를 사용하지 않고 예상 작동하기 때문에 것으로 나타났습니다.

+0

오, 이런, 나는 그것을 좋아한다. – Rangoric

1

대신 인터페이스를 사용할 수 있습니까? 또한이 경우 더 잘 작동 할 수있는 비 제너릭 Mapper.Map 구현이 있습니다. 매핑을 설정했다면 유형을 전달하면됩니다. 당신은 그러나 당신이 TypeConverter를 함께 해결할 수 있습니다, 당신은 지도 객체는 당신이 직접 할 수 없어도

+0

나는 인터페이스가 도움이 될지 모르며 비 제너릭은 여전히 ​​구체적인 유형을 알아야합니다. –

+0

typeof (obj)를 매개 변수로 전달할 수 없습니까? 확실하게 어떻게 든 그 타입을 해결할 수 있습니다. –

+0

나는 typeof 감사 주위에 놀거야. –

0

없음이 정확하지 않습니다.

public class MyTypeConverter : TypeConverter<BaseViewModel, BaseDto> 
{ 
    protected override BaseDto ConvertCore(BaseViewModel tViewModel) 
    { 
     BaseDto vResult = null; 
     if(tViewModel is FirstViewModelImpl) 
     { 
      var vSource = tViewModel as FirstViewModelImpl; 
      vResult = Mapper.Map<FirstViewModelImpl,FirstDtoImpl>(vSource); 
     } 
     else if(tViewModel is SecondViewModelImpl) 
     { 
      var vSource = tViewModel as SecondViewModelImpl ; 
      vResult = Mapper.Map<SecondViewModelImpl ,SecondDtoImpl>(vSource); 
     } 
     return vResult; 
    } 
} 

그럼 당신이 원하는 사용할 수 있습니다 :

Mapper.CreateMap<BaseViewModel, BaseDto>() 
    .ConvertUsing<MyTypeConverter>(); 

는 그런 다음과 같이 컨버터를 만들 수 있습니다

매핑에서는 추가합니다

BaseDto dto= Mapper.Map<BaseViewModel,BaseDto>(myViewModel); 

하고 있습니다 실제로 당신이 원하는 유형이어야합니다.

기본 유형을 서로 매핑하지는 않습니다. 그게 중요하다면 나는 그것을 조금 더 비틀어 넣을 수있다.

3

파생 클래스를 지정해야 할 때 파생 된 형식에 대한 매핑을 만들 경우

+0

유망 해 보인다. 기본 유형은 중요하지 않습니다. 실제 코드에서는 추상적입니다. –

관련 문제