2017-06-13 11 views
1
public class BaseViewModel 
{ 
    public MyEnum EnumValue {get;set;} 
    public string PropA { get; set; } 
} 

public class Enum1ViewModel : BaseViewModel 
{ 
    public string PropB {get; set;} 
} 

public class Enum2ViewModel : BaseViewModel 
{ 
    public string PropC {get; set;} 
} 

public class Enum3ViewModel : BaseViewModel 
{ 
    public string PropD {get; set;} 
} 

public enum MyEnum 
{ 
    Value1, 
    Value2, 
    Value3 
} 

public class MyEntity 
{ 
    public MyEnum EnumValue {get; set;} 
    public string PropA {get;set;} 
    public string PropB {get;set;} 
    public string PropC {get;set;} 
    public string PropD {get;set;} 
    public string PropE {get;set;} 
} 

public class MapperProfile : Profile 
{ 
    public MapperProfile() 
    { 
     CreateMap<Enum1ViewModel, MyEntity>() 
      .ForMember(m => m.EnumValue, o => o.UseValue(MyEnum.Value1) 
      .ForMember(m => m.PropC, o => o.Ignore()) 
      .ForMember(m => m.PropD, o => o.Ignore()) 
      .ForMember(m => m.PropE, o => o.Ignore()); 

     CreateMap<Enum2ViewModel, MyEntity>() 
      .ForMember(m => m.EnumValue, o => o.UseValue(MyEnum.Value2) 
      .ForMember(m => m.PropB, o => o.Ignore()) 
      .ForMember(m => m.PropD, o => o.Ignore()) 
      .ForMember(m => m.PropE, o => o.Ignore()); 

     CreateMap<Enum3ViewModel, MyEntity>() 
      .ForMember(m => m.EnumValue, o => o.UseValue(MyEnum.Value3) 
      .ForMember(m => m.PropB, o => o.Ignore()) 
      .ForMember(m => m.PropC, o => o.Ignore()) 
      .ForMember(m => m.PropE, o => o.Ignore()); 

      // Question: How do I do the reverse mapping?? 
    } 
} 

私はジミーボーガードにこの質問をしましたが、答えはおそらくもっと自分自身を助けることができると思いました。AutoMapper:列挙型の値に応じてビューモデルへのマッピングクラス

私がジミーの答えをここに掲載する前に、あるいは皆さんの誰かが自分で答えます。

+0

コード内の問題は何ですか? –

答えて

1

いいえ、これは不可能であり、https://github.com/AutoMapper/AutoMapper/issues/258を参照してください。それに対処するプルリクエストがありましたが、EFのようなORMでは動作しません。これは何よりも混乱を招きます。

ベスト・ベットは、アプリケーション・コード内のMapper.Map(おそらくもっと明白でしょう)を呼び出して、switch文を列挙して呼び出します。

+0

これはまさに私が最後に終わったものです。これは、拡張メソッドのswitch文です。素早く助けてくれてありがとう! –

0

両方のクラスがenumを使用するので、これはのように単純でなければなりません:あなたはAutoMapperは、単にではない任意のプロパティをマップしないこと(自分の構成に応じて)MyEntityに直接あなたのViewModelをマッピングしようとすることができます

CreateMap<MyEntity, Enum1ViewModel>(); 
CreateMap<MyEntity, Enum2ViewModel>(); 
CreateMap<MyEntity, Enum3ViewModel>(); 
0

前者に存在する。

それはあなたのために動作しない場合は、オプションは次のような条件付きのマッピングを使用することですが:ここ

Mapper.CreateMap<MyEntity , Enum1ViewModel>() 
.ForMember(
    destination => destination.PropA , 
    option => 
    { 
     option.Condition(rc => 
     { 
      var myViewModel = (Enum1ViewModel)rc.InstanceCache.First().Value; 
      return myViewModel.EnumValue == MyEnum.Value1; 
     }); 

     option.MapFrom(source => source.PropA); 
    } 
); 

詳細情報:https://github.com/AutoMapper/AutoMapper/wiki/Conditional-mapping

関連する問題