【问题标题】:Automapper mapping Flags Enum from ViewModel to Domain modelAutomapper 将标志枚举从 ViewModel 映射到域模型
【发布时间】:2014-05-30 16:24:57
【问题描述】:

在尝试使用 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 或其他方式)?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢,吉米。我希望避免在这个庞大的 VM 中映射大量属性。自定义模型绑定器只需最少的代码即可完成此任务。似乎最好完全避免在域模型中使用标记的枚举,而只是按照旧的方式来做。
      • 生成代码的任何示例?这也对我有帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多