Automapper返回一个空集合,我想要一个null

c0D*_*g1c 18 .net c# automapper

public class Person
{
   Name { get; set; }
   IEnumerable<Address> Addresses { get; set; }
}

public class PersonModel
{
   Name { get; set; }
   IEnumerable<AddressModel> Addresses { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果我映射PersonPersonModel这样:

Mapper.DynamicMap<Person, PersonModel>(person);
Run Code Online (Sandbox Code Playgroud)

如果Addresses属性on Person为null,则它们将映射PersonModel为空Enumerable而不是null.

如何获得PersonModelnull Addresses而不是空Enumerable

Kir*_*man 33

简单的答案是使用AllowNullCollections:

AutoMapper.Mapper.Initialize(cfg =>
{
    cfg.AllowNullCollections = true;
});
Run Code Online (Sandbox Code Playgroud)

或者如果您使用实例API

new MapperConfiguration(cfg =>
{
    cfg.AllowNullCollections = true;
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 14

除了AllowNullCollections映射器配置初始化中进行设置(如本答案中所述)之外,您还可以选择AllowNullCollectionsProfile定义中进行设置,如下所示:

public class MyMapper : Profile
{
    public MyMapper()
    {
        // Null collections will be mapped to null collections instead of empty collections.
        AllowNullCollections = true;

        CreateMap<MySource, MyDestination>();
    }
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*lla 9

因此,使用Automapper可能有几种方法可以实现这一点,这只是一个:

Mapper.CreateMap<Person, PersonMap>()
   .AfterMap( (src, dest) => dest.Addresses = dest.Addresses?.Any() ? dest.Addresses : null );
Run Code Online (Sandbox Code Playgroud)

此代码使用新的c#?.运算符来保证null安全性,因此如果您不能在代码中使用该功能,则可能需要删除它并检查null.

  • 不应该是 src.Addresses?.Any() 而不是 dest.Addresses?.Any() 还是我弄错了?您想知道源是否为空,如果是,则将目标保留为空 (2认同)