我将AutoMapper 6.0.2用作将部分填充的对象合并到现有的完全填充的对象的一部分,其中部分填充的对象的null值将被忽略。我使用自定义值解析程序来忽略null值有效,但是当我尝试将其配置为也忽略零长度列表时,它无法正常工作。
这里是简化的代码:
public class cTest
{
public List<double> dList { get; set; }
}
public class ValueResolver : IMemberValueResolver<object, object, object, object>
{
public object Resolve(object source, object destination, object sourceMember, object destinationMember, ResolutionContext context)
{
var collection = sourceMember as System.Collections.ICollection;
if (collection != null && collection.Count == 0)
{
return destinationMember;
}
return sourceMember ?? destinationMember;
}
}
[TestFixture]
public class MergeTests
{
[Test]
public void MergeTest()
{
var newObj = new cTest { dList = new List<double>() };
var existingObj = new cTest { dList = new List<double> { 1, 2, 3 } };
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<cTest, cTest>();
cfg.ForAllPropertyMaps(pm => true, (pm, c) => c.ResolveUsing(new ValueResolver(), pm.SourceMember.Name));
});
config.AssertConfigurationIsValid();
var m = config.CreateMapper();
var testResult = m.Map(newObj, existingObj);
Assert.AreEqual(new List<double>() { 1, 2, 3 }, testResult.dList);
}
}
[当我单步执行时,正在敲击return destinationMember;
行-因此我不确定testResult.dList
为什么导致空列表(newObj值)而不是目的地(existingObj)值。
任何人都可以帮助解释我所缺少的吗?
欢呼声
您的代码有一个条件,如果collection.Count == 0
为true,则返回return destinationMember;
。这意味着映射后destinationMember
为空。所以代码按预期工作
if (collection != null && collection.Count == 0)
{
return destinationMember;
}
当前正在通过此行var testResult = m.Map(newObj, existingObj);
映射newObj
到existingObj
,如果打算用newObj
的项目填充existingObj
,那么您应该Map
反转,即var testResult = m.Map(existingObj, newObj);