当尝试使用 AutoMapper 在我的 ViewModel 和我的域模型之间进行转换时,我注意到它不能很好地与标记为 Flags 属性的枚举一起使用。
这是类的快速模型:
View 模型:
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 或其他方式)?
最佳答案
当映射到 View 模型时,您可以尝试使用 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));
至于这是否是最佳方法,这实际上取决于 View 模型的使用方式。目前, View 模型不包含未设置的标志;你需要它们来渲染 View 吗?
关于c# - Automapper 将 Flags Enum 从 ViewModel 映射到域模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23959190/