【问题标题】:AutoMapper: Mapping class to viewmodels depending on the value of an enumAutoMapper:根据枚举的值将类映射到视图模型
【发布时间】:2017-06-13 21:37:23
【问题描述】:
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 上向 Jimmy Bogard 提出了这个问题,但我认为这个答案可能会帮助更多的人,而不仅仅是我自己。

如果我在 Jimmy 在这里发布之前得到他的回答,或者你们中的任何人,我会自己回答。

【问题讨论】:

  • 这里的代码有什么问题?

标签: c# .net enums automapper


【解决方案1】:

不,这是不可能的,请参阅https://github.com/AutoMapper/AutoMapper/issues/258。有一个拉取请求来解决它,但它不适用于像 EF 这样的 ORM,这会导致更多的混乱。

您最好的选择是在枚举上使用 switch 语句并在您的应用程序代码中调用 Mapper.Map(这可能更明显)。

【讨论】:

  • 这正是我最终得到的结果,扩展方法中的 switch 语句。再次感谢您的快速帮助!
【解决方案2】:

您可以尝试将您的 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

【讨论】:

    【解决方案3】:

    因为两个类都使用枚举,所以应该很简单:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多