我正在使用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
}
}
答案 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。