当源数组在单个已配置地图上为空时,允许自动映射器将数组 属性 设置为空数组

Allow automapper to set an array property to an empty array when the source array is null on a single configured map

这是对上一个问题的跟进: Automapper sets an array property to a zero-length array rather than null

    private class Fiz
    {
        public string Str { get; set; }

        public string[] StrArr { get; set; }

        public object[] ObjArr { get; set; }
    }

    private class Baz
    {
        public string Str { get; set; }

        public string[] StrArr { get; set; }

        public object[] ObjArr { get; set; }
    }

    [TestMethod]
    public void ShouldAllowMapArrayToNull()
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.AllowNullDestinationValues = true;
            cfg.CreateMap<Fiz, Baz>().ForMember(b => b.Str, opt => opt.Ignore())
                //.ForMember(b => b.StrArr, opt => opt.MapFrom(f => f.StrArr))
                //.ForMember(b => b.ObjArr, opt => opt.MapFrom(f => f.ObjArr))
                .ForMember(b => b.StrArr, opt => opt.ResolveUsing(f => f.StrArr))
                .ForMember(b => b.ObjArr, opt => opt.ResolveUsing(f => f.ObjArr))

        });
        var mapper = config.CreateMapper();
        var fiz = new Fiz
        {
            Str = null,
            StrArr = null,
            ObjArr = null
        };
        var baz = mapper.Map<Fiz, Baz>(fiz);
        Assert.AreEqual(null, baz.Str,"string mapping to null");
        Assert.AreEqual(null, baz.StrArr,"string arr mapping to null");
        Assert.AreEqual(null, baz.ObjArr,"object arr mapping to null");
    }

在上面的例子中,baz如下:baz.Str == null, baz.StrArr == string[0], baz.ObjArr == object[0]

尽管在原始问题中使用了建议的解决方案,但似乎无法将目标数组映射到 null,尽管源数组本身为 null。

有没有办法解决这个问题(即允许将 dest 参数实际映射到 null),或者这是一个已知的限制?

编辑: cfg.AllowNullCollections = true; 解决了这个问题(感谢 MosheG),但是这将适用于在映射器配置下创建的所有地图。有没有办法在单个创建的地图上允许 null 而不是空数组?

这是设计使然。 如果您愿意,可以更改默认值:

var configuration = new MapperConfiguration(cfg => {
    cfg.AllowNullCollections = true;
    cfg.CreateMap<Source, Destination>();
});

或者为一个映射更改它(虽然,我没有尝试这个)。

https://docs.automapper.org/en/stable/Lists-and-arrays.html#handling-null-collections