AutoMapper:根据枚举的值将类映射到视图模型

时间:2017-06-13 13:06:16

标签: c# .net enums automapper

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提出了这个问题,但我认为答案可能会帮助更多的人,而不仅仅是我自己。

如果我在这里发帖之前得到了吉米的回答,或者你们其中任何一个人我会自己回答。

3 个答案:

答案 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