C# AutoMapper映射到枚举默认值,而不是在null时跳过

C# AutoMapper映射到枚举默认值,而不是在null时跳过,c#,enums,automapper,nullable,C#,Enums,Automapper,Nullable,我正在使用automapper更新对象的属性;合并两个对象,但仅当源成员为!=无效的据 显然,它不适用于枚举。调用MergeObject方法后,它将映射到枚举默认值Pendente,而不是忽略它并保持目标不变 例如,它可以很好地用于可为null的int 调试时,如果我在条件=>member!=null,它将显示member=Pendente,即使Source.Situacao为null 点击F10将转到下一个成员,但您可以看到它更改了destination.Situacao值 对我来说这似乎是一

我正在使用automapper更新对象的属性;合并两个对象,但仅当源成员为!=无效的据

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

例如,它可以很好地用于可为null的int

调试时,如果我在条件=>member!=null,它将显示member=Pendente,即使Source.Situacao为null

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

对我来说这似乎是一个错误,但我的电脑已经关闭了。有什么想法吗

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);
}

第二种类型中的枚举似乎不可为空

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
}

第二种类型中的枚举似乎不可为空

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
}

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

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

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

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

这就是为什么我创建了映射以仅映射null映射值的类型不可为null,因此它将默认为第一个枚举值。如果交换枚举中的值,则每次仅拾取第一个值。否则您会期望什么行为?我希望它根据条件跳过此成员相对于源中的值的映射。这不是它应该工作的方式吗?Automapper很可能会跳过该属性。做一个新的FooModel,告诉我Situacao在实例化中的价值是什么。您将看到全新的FooModel将选择枚举的默认值。如果希望它为null或其他默认值,则需要定义它。它实际上是在更改目标对象的属性,而不是完全跳过它。这与枚举属性的默认值无关。可能是当源属性为null,因此与条件不匹配时,要存储到目标属性中的值是该枚举的默认值,但问题不是目标对象上的属性默认为该枚举的值,问题是,默认值实际上是由映射程序写入属性的。这就是为什么我创建了映射,以便只映射那些是的成员!=null映射值的类型不可为null,因此它将默认为第一个枚举值。如果交换枚举中的值,则每次仅拾取第一个值。否则您会期望什么行为?我希望它根据条件跳过此成员相对于源中的值的映射。这不是它应该工作的方式吗?Automapper很可能会跳过该属性。做一个新的FooModel,告诉我Situacao在实例化中的价值是什么。您将看到全新的FooModel将选择枚举的默认值。如果希望它为null或其他默认值,则需要定义它。它实际上是在更改目标对象的属性,而不是完全跳过它。这与枚举属性的默认值无关。可能是当源属性为null因此与条件不匹配时,要存储到目标属性中的值是该枚举的默认值,但问题不是目标对象上的属性默认为该枚举的值,而是默认值实际上是由映射器写入属性的。