从视图模型到域模型的自动映射标志枚举
本文关键字:模型 映射 标志 枚举 视图 | 更新日期: 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中,你可以直接挂钩到模型绑定,这样所有的值就可以组合成一个。