自动映射器和处理空属性

时间:2020-03-12 16:04:25

标签: c# linq automapper

我的映射设置如下:

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

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

我的问题是,如何处理“提供者”为null的情况?

我尝试使用:

src?.Providers?.FirstOrDefault()

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

我一直在阅读Automapper,但仍不确定AM是否会自动处理空值。我尝试构建表达式树,但看不到任何提供其他信息的信息。

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

2 个答案:

答案 0 :(得分: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()));

如果您需要切换逻辑或执行更复杂的操作,则可以在将来更改值转换器。

修改

由于您使用的是旧版本,因此可以使用私有/静态/扩展方法执行相同的操作。像

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

出于可读性考虑,通常我倾向于这样做,而不是内联,因为事情变得越来越复杂

答案 1 :(得分:1)

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