Automapper 和处理空属性

Automapper and dealing with null properties

我的映射设置如下:

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

我从 SourceClass 中的列表映射到目标中的字符串 class。

我的问题是,如何处理 "Providers" 为空的情况?

我试过使用:

src?.Providers?.FirstOrDefault()

但我收到一条错误消息,提示我不能在 lambda 中使用 null 传播器。

我一直在阅读 Automapper,但仍然不确定 AM 是否会自动处理 null 情况。我尝试构建表达式树,但无法看到任何提供附加信息的信息。

如果有帮助,我正在使用 automapper v 6.1.1。

您可以尝试将 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()));

这将允许您在将来需要切换逻辑或做更复杂的事情时更改值转换器。

编辑

由于您使用的是旧版本,您可以使用 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)));

为了可读性,我通常更喜欢这样做而不是在事情变得更复杂时内联做一些事情

尝试使用 AutoMapper 中的 NullSubstitution 选项 你可以阅读 here