AutoMapper映射到Enum默认值,而不是如果为空则跳过

时间:2019-05-10 16:05:23

标签: c# enums automapper nullable

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

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

例如,对于可为null的int来说,它可以正常工作。

在调试时,如果我在条件(=> member != null)上设置一个断点,即使Pendente为空,它也会显示member = 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);
}

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

EDIT2: 我设法使用下面的代码实现了自己的目标,但是我必须明确指定成员。是否有将其应用于所有成员的通用方法?

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

2 个答案:

答案 0 :(得分:3)

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

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
}

答案 1 :(得分:0)

在我的第二次编辑中最终使用了该解决方案,谢谢大家的投入。

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