当源数组在单个已配置地图上为空时,允许自动映射器将数组 属性 设置为空数组
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
这是对上一个问题的跟进: 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