自动映射将标记枚举从ViewModel映射到域模型

时间:2014-05-30 16:24:58

标签: c# asp.net-mvc mvvm enums automapper

在尝试使用AutoMapper在我的ViewModel和我的域模型之间进行转换时,我注意到它与标记Flags属性的Enums不兼容。

这是类的快速模型:

视图模型:

public class TestViewModel
{
    // array of individual Enum values
    public TestEnum[] TestEnum { get; set; } 
}

域名模型:

public class TestModel
{
    // single Enum marked with flags attribute
    public TestEnum TestEnum { get; set; }
}

枚举:

[Flags]
public enum TestEnum
{
    Test1,
    Test2,
    Test3,
    Test4
}

这就是我想要做的。我想在我的Automapper配置中需要一种自定义解析器,因为它在我执行Mapper.Map()时会抛出异常。

我的问题:我将如何做到这一点?

额外问题:这是处理Viewmodel中的标志枚举/位掩码的最佳做法 - >域模型(在MVVM方面)?如果没有,你会建议采用什么做法(使用AutoMapper或其他方式)?

2 个答案:

答案 0 :(得分:4)

映射到视图模型时,可以尝试使用Enum.GetValues()和LINQ来获取枚举值列表。要映射回模型,请尝试使用Aggregate() ...

Mapper.CreateMap<TestModel, TestViewModel>()
    .ForMember(v => v.TestEnum, 
        x => x.MapFrom(m => Enum.GetValues(typeof(TestEnum))
                            .Cast<TestEnum>()
                            .Where(e => (e & m) > 0)
                            .ToList()))
    .ReverseMap()
    .ForMember(m => m.TestEnum,
        x => x.MapFrom(v => v.Aggregate((i, j) => i | j));

至于这是否是最好的方法,它实际上取决于视图模型的使用方式。目前,视图模型不包含未设置的标志;你需要它们来渲染视图吗?

答案 1 :(得分:1)

我跳过AutoMapper并进入模型绑定路径。如果您使用的是ASP.NET MVC,则可以直接挂钩到模型绑定中,以便将所有值合并为一个。