配置Automapper自定义值解析器以忽略零长度列表值

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

我将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)值。

任何人都可以帮助解释我所缺少的吗?

欢呼声

c# automapper
1个回答
0
投票

您的代码有一个条件,如果collection.Count == 0为true,则返回return destinationMember;。这意味着映射后destinationMember为空。所以代码按预期工作

  if (collection != null && collection.Count == 0)
  {
    return destinationMember;
  }

当前正在通过此行var testResult = m.Map(newObj, existingObj);映射newObjexistingObj,如果打算用newObj的项目填充existingObj,那么您应该Map反转,即var testResult = m.Map(existingObj, newObj);

© www.soinside.com 2019 - 2024. All rights reserved.