从视图模型到域模型的自动映射标志枚举

本文关键字:模型 映射 标志 枚举 视图 | 更新日期: 2023-09-27 18:05:52

在尝试使用AutoMapper在我的ViewModel和我的域模型之间进行翻译时,我注意到它不能很好地与标记了Flags属性的枚举一起使用。

下面是一个类的快速模型:

ViewModel:

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; }
}
Enum:

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

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

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

附加问题:这是处理标志枚举/位掩码在Viewmodel ->域模型(在MVVM方面)的最佳实践吗?如果没有,您建议使用什么方法(使用AutoMapper或其他方法)?

从视图模型到域模型的自动映射标志枚举

当映射到视图模型时,您可以尝试使用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));

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

我将跳过AutoMapper,走模型绑定路线。如果你正在使用ASP。. NET MVC中,你可以直接挂钩到模型绑定,这样所有的值就可以组合成一个。