c# - Automapper 将 Flags Enum 从 ViewModel 映射到域模型

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

当尝试使用 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/

相关文章:

c# - 为什么 C# 不支持 base.base?

c# - OpenCVSharp坐标与System.Drawing坐标之间的转换

wpf - ListBox.ContextMenu 通过命令获取所选项目

HTML 到 Excel 格式 : mso-number-format currency without decimal?

c# - WPF MVVM 层次结构选择项

android - 如何在MvvmCross版本中制作DrawerMenu? v.5.4.2

javascript - 通过 Web 套接字网络在 C# 服务器上传输 JSON 字符串数据

c# - 如何在大型项目中进行单元测试

asp.net-mvc - ASP.Net State Server 是一个优雅的解决方案吗?

javascript - 如何在 html/javascript 中将带有某些类的 div 添加到另一个 div(彼此内部)