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??
}
}
我在推特上向Jimmy Bogard提出了这个问题,但我认为答案可能会帮助更多的人,而不仅仅是我自己。
如果我在这里发帖之前得到了吉米的回答,或者你们其中任何一个人我会自己回答。
答案 0 :(得分:1)
不,这是不可能的,请参阅https://github.com/AutoMapper/AutoMapper/issues/258。有一个拉取请求来解决它,但它不适用于像EF这样的ORM,这会引起比任何事情更多的混乱。
您最好的选择是枚举上的switch
语句,并在您的应用程序代码中调用Mapper.Map
(无论如何,这可能更明显)。
答案 1 :(得分:0)
因为两个类都使用枚举,所以这应该简单:
CreateMap<MyEntity, Enum1ViewModel>();
CreateMap<MyEntity, Enum2ViewModel>();
CreateMap<MyEntity, Enum3ViewModel>();
答案 2 :(得分:0)
您可以尝试将ViewModel直接映射到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