Automapper и работа с нулевыми свойствами - PullRequest
0 голосов
/ 12 марта 2020

Я установил свое отображение следующим образом:

CreateMap<SourceClass, DestinationClass>().ForMember(destinationMember => destinationMember.Provider,
                memberOptions => memberOptions.MapFrom(src => src.Providers.FirstOrDefault()));

Где я отображаю из списка в моем SourceClass строку в моем классе назначения.

Мой вопрос Как я могу обработать случай, когда «Провайдеры» имеет значение null?

Я пытался использовать:

src?.Providers?.FirstOrDefault()

, но я получаю сообщение об ошибке " Я не использую нулевые пропагаторы в лямбде.

Я читал об Automapper и до сих пор не уверен, обрабатывает ли AM автоматически нулевой регистр или нет. Я пытался построить дерево выражений, но не смог увидеть никакой информации, предоставляющей дополнительную информацию.

Если это поможет, я использую automapper v 6.1.1.

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Попробуйте использовать опцию NullSubstitution из AutoMapper, которую вы можете прочитать здесь

1 голос
/ 12 марта 2020

Вы можете попробовать использовать ValueConverter с AutoMapper. Это может выглядеть примерно так:

public class ListFormatter : IValueConverter<string, List<string>>
{
  public List<string> Convert(string source)
  {
    if (source != null)
    {
      return new List<string> { source };
    }
    return new List<string>();
  }
}

И тогда вы можете использовать это так:

CreateMap<SourceClass, DestinationClass>()
  .ForMember(destinationMember => destinationMember.Provider,
             memberOptions => memberOptions.ConvertUsing(new ListFormatter()));

Это позволит вам в будущем изменить ваш конвертер значений, если вам нужно будет переключить логи c или сделать что-то более сложное.

Редактировать

Поскольку вы используете более старую версию, вы можете использовать метод private / static / extension для того же предмет. Итак, что-то вроде

List<string> ConvertStringToList(string source)
{
  if (source != null)
  {
    return new List<string> { source };
  }
  return new List<string>();
}

, а затем назовите это так:

CreateMap<SourceClass, DestinationClass>()
  .ForMember(destinationMember => destinationMember.Provider,
             memberOptions => memberOptions.MapFrom(src => ConvertStringToList(src.Provider)));

Я обычно предпочитаю делать что-то встроенное, когда все становится более сложным, для удобства чтения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...