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

问题描述 投票:0回答:2

这是上一个问题的后续: Automapper 将数组属性设置为零长度数组而不是 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。

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

编辑:

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

automapper
2个回答
2
投票

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

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


0
投票

要为每个字段定义空映射,有一个配置方法AllowNull

使用示例:

        var config = new MapperConfiguration(cfg =>
                {
                    cfg.CreateMap<Fiz, Baz>()
                        .ForMember(b => b.StrArr, opt => opt.MapFrom(f => f.StrArr))
                        .ForMember(b => b.StrArr, opt => opt.AllowNull())
                        .ForMember(b => b.ObjArr, opt => opt.MapFrom(f => f.ObjArr))
                        .ForMember(b => b.ObjArr, opt => opt.AllowNull());
                });

自版本10.0.0起,它会覆盖通过AllowNullDestinationValues/Collections

全局设置的参数
© www.soinside.com 2019 - 2024. All rights reserved.