首页 > 解决方案 > Automapper 和处理空属性

问题描述

我的映射设置如下:

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

我从 SourceClass 中的 List 映射到目标类中的字符串。

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

我试过使用:

src?.Providers?.FirstOrDefault()

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

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

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

标签: c#linqautomapper

解决方案


您可以尝试使用带有 AutoMapper的ValueConverter 。这可能看起来像这样

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

如果您需要切换逻辑或执行更复杂的操作,这将允许您在未来更改您的值转换器。

编辑

由于您使用的是旧版本,因此您可以使用私有/静态/扩展方法来做同样的事情。所以像

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

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


推荐阅读