Automapper将数组属性设置为零长度数组而不是null

时间:2011-12-06 23:53:37

标签: automapper

我正在使用Automapper将值从一个实例复制到另一个实例,并且我发现如果该类具有数组属性,并且源实例的属性设置为null,则Automapper会设置目标如我所料,属性为零长度数组而不是null

当来源为null时,有没有办法配置自动映射器将目的地设置为null

如果我的解释不清楚,以下代码说明了我想要描述的内容:

public class Test
{
    public byte[] ByteArray { get; set; }
    public int? NullableInt { get; set; }
    public int Int { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Mapper.CreateMap<Test, Test>();

        var test1 = new Test { Int = 123, NullableInt = null, ByteArray = null };
        var test2 = Mapper.Map<Test>(test1);

        // test1:  Int == 123, NullableInt == null, ByteArray == null
        // test2:  Int == 123, NullableInt == null, ByteArray == byte[0]  <-- expect this to be null
    }
}

2 个答案:

答案 0 :(得分:38)

我发现这已经报告为issue,并添加了新的配置选项(请参阅此commit)。目前,该选项不在NuGet提供的版本中,但我能够找到一种方法来处理这个问题,直到下一个版本发布:

Mapper.CreateMap<Test, Test>()
    .ForMember(t => t.ByteArray, opt => opt.ResolveUsing(t => t.ByteArray == null ? null : t.ByteArray));

更新:

从版本2.1.265.0开始,您可以使用AllowNullCollections属性:

Mapper.Configuration.AllowNullCollections = true;
Mapper.CreateMap<Test, Test>();

答案 1 :(得分:0)

我认为这对于源和目标使用完全相同的类型只是一个怪癖。如果你实际上使它们成为不同的类型,则字节数组将为null。