2017-06-13 177 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