AutoMapper отображает значение Enum по умолчанию вместо пропуска, если ноль - PullRequest
0 голосов
/ 10 мая 2019

Я использую Autopper для обновления свойств объекта; «объединение» двух объектов, но только если исходный член имеет значение! = null. (Согласно этот вопрос )

Видимо, он не работает с Enums. После вызова метода MergeObject он сопоставляется со значением по умолчанию перечисления (Pendente), а не игнорирует его и оставляет пункт назначения таким, какой он есть.

Работает нормально для nullable int, например.

При отладке, если я установлю точку останова для условия (=> member != null), он покажет member = Pendente, даже если Source.Situacao равно нулю.

enter image description here

Нажав F10, вы переходите к следующему члену, но вы можете видеть, что оно изменило destination.Situacao значение.

enter image description here

Мне кажется, что это ошибка, но моя проблема была закрыта. Какие-нибудь мысли?

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: Моя цель - в основном реализовать функциональность, описанную в здесь , но я не вижу свойства IsSourceValueNull.

EDIT2: Мне удалось достичь своей цели, используя следующую строку, но я должен был указать член явно. Есть ли общий способ применить это ко всем участникам?

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

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Похоже, ваш enum не имеет значения null для вашего второго типа.

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

Кроме того, я очень рекомендую установить безопасное значение по умолчанию для вашегоenum, пример:

public enum Status
{
    None,
    Pendente,
    EmProcessamento,
    Processada
}
0 голосов
/ 16 мая 2019

Закончилось, используя решение во втором редактировании, спасибо всем за вклад.

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