2017-06-13 175 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?? 
    } 
} 

我在twitter上向吉米Bogard問了這個問題,但我認爲答案可能會幫助更多的人,然後只是我自己。AutoMapper:根據枚舉值將類映射到視圖模型

如果我在Jimmy的回答發佈之前,或者你們任何一個人,我會自己回答。

+0

代碼中的問題是什麼? –

回答

1

不,這是不可能的,看到https://github.com/AutoMapper/AutoMapper/issues/258 。有一個拉取請求來解決它,但它不適用於像EF這樣的ORM,這會導致比任何事情都更加混亂。

最好的辦法是在你的應用程序代碼中使用enum上的switch聲明並調用Mapper.Map(反正這可能更明顯)。

+0

這就是我最終得到的結果,即擴展方法中的switch語句。再次感謝您的迅速幫助! –

0

,因爲這兩個類使用枚舉這應該是簡單:

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

您可以嘗試直接映射您的視圖模型來myEntity所和(取決於您的配置)AutoMapper可能根本無法映射不屬於任何屬性目前在前者。

如果不爲你工作,一個選擇是使用類似這樣的條件映射:

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