c# - AutoMapper 映射到 Enum 默认值,而不是在 null 时跳过

标签 c# enums automapper nullable

我正在使用自动映射器来更新对象的属性; “合并”两个对象,但前提是源成员为 != null。 (根据 this question )

显然它不适用于枚举。调用 MergeObject 方法后,它映射到枚举默认值 (Pendente),而不是忽略它并保持目的地不变。

例如,它适用于可空 int。

调试时,如果我在条件 (=> member != null) 上设置断点,它会显示 member = Pendente,即使 Source.Situacao 为空。

enter image description here

按 F10 转到下一个成员,但您可以看到它更改了 destination.Situacao 值。

enter image description here

这对我来说似乎是一个错误,但我的 issue关门了。有什么想法吗?

public class FooViewModel
{
    public Guid Id { get; set; }
    public Status? Situacao { get; set; }
}

public class FooModel
{
    public Guid Id { get; set; }
    public Status Situacao { get; set; }
}

public enum Status
{
    Pendente,
    EmProcessamento,
    Processada
}

private static void Initialize()
{
    Mapper.Initialize(cfg =>
    {
        cfg.CreateMap<FooViewModel, FooModel>()
          .ForAllMembers(o => o.Condition((source, destination, member) => member != null));
    });
}

public static void MergeObject(FooViewModel source, FooModel destination)
{
    Mapper.Map(source, destination);
}

编辑1: 我的目标是基本上实现 here 中描述的功能但我看不到属性 IsSourceValueNull

编辑2: 我设法使用以下行实现了我的目标,但我必须明确指定成员。有没有一种通用的方法可以将其应用于所有成员?

cfg.CreateMap<FooViewModel, Foo>()
                    .ForMember(dest => dest.Situacao, opt => opt.MapFrom((source, dest) =>  source.Situacao ?? dest.Situacao));

最佳答案

看起来您的枚举在您的第二种类型中不可为空。

public class FooModel
{
    public Guid Id { get; set; }
    public Status Situacao { get; set; }
}

应该是

public class FooModel
{
    public Guid Id { get; set; }
    public Status? Situacao { get; set; }
}

此外,我强烈建议为您的枚举设置一个安全的默认值,例如:

public enum Status
{
    None,
    Pendente,
    EmProcessamento,
    Processada
}

关于c# - AutoMapper 映射到 Enum 默认值,而不是在 null 时跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56081198/

相关文章:

ios - 如何在 Swift 的枚举中选择一个带有函数的枚举值?

c++ - 在类中访问枚举时出错

c# - AutoMapper 如何根据上下文以不同方式将对象 A 映射到对象 B

automapper - 在自动映射器中重用映射

C++ 枚举问题和 g++ 中可能的循环依赖

c# - 如何配置 AutoMapper 将所有引用类型集合转换为整数集合?

c# - 减少代码行数

javascript - 如何在RadGrid的编辑表单中ajaxify控件

c# - 从列表中获取不同计数

c# - 如何在 XAML 中访问我的 ListBox 的 DataTemplate(但不是绑定(bind))中的 TextBlock?