将空列表自动映射到空列表

Automapper empty list to empty list

我有以下两个class:

我有两个 classes

 public class SourceClass
{
    public Guid Id { get; set; }
    public string Provider { get; set; }
}


public class DestinationClass
{
    public Guid Id { get; set; }
    public List<string> Providers { get; set; }
}

我的自动映射器有以下映射

CreateMap<SourceClass, DestinationClass>()
  .ForMember(destinationMember => destinationMember.Providers,
  memberOptions => memberOptions.MapFrom(src => new List<string> {src.Provider ?? ""}));

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

我写了一些单元测试,可以确认以下行为:

当我的目的地 class 中的 Providers 为 null 时,它映射到 null,这很棒。但是,我想更改我的映射,以便如果 Providers 是一个空列表,它会映射到一个空列表,同样,如果 Provider 是 null,我希望它映射到一个空列表而不是一个列表空字符串。

有人知道我该怎么做吗?我已经尝试过从 SourceClass 到 DestinationClass 的映射:

CreateMap<SourceClass, DestinationClass>()
      .ForMember(destinationMember => destinationMember.Providers,
memberOptions => memberOptions.MapFrom(src => !string.IsNullOrEmpty(src.Provider) ? new List<string> {src.Provider} : new List<string>()));

但是反过来,一个空列表映射到 null,而不是一个空列表。 (我认为是因为 FirstOrDefault() )。有谁知道我该如何解决这个问题?

是的。我认为这是因为它的 FirstOrDefaults( ) .. 为什么不使用相同的三元运算符或 if 语句来放置映射条件?

已使用 AutoMapper 6.1.1 测试此映射

var config = new MapperConfiguration(cfg =>
{
  cfg.CreateMap<SourceClass, DestinationClass>()
    .ForMember(dest => dest.Providers, 
    opt => opt.MapFrom(src => string.IsNullOrEmpty(src.Provider) ? new List<string>() 
                                                                 : new List<string> { src.Provider }));

    cfg.CreateMap<DestinationClass, SourceClass>()
      .ForMember(dest => dest.Provider, 
      opt => opt.MapFrom(src => src.Providers == null ? "" 
                                                      : src.Providers.FirstOrDefault() ?? ""));
});

如果您真的想要它 "inline" 就可以了。我仍然认为,如果您将它移出到您可以调用的方法中,或者如果您可以升级 AutoMapper 以利用内置的转换器映射,它会更容易阅读。希望这能为您提供足够的信息来开始。