Настройка преобразователя пользовательских значений Automapper для игнорирования значений списка нулевой длины - PullRequest
0 голосов
/ 30 октября 2019

Я использую AutoMapper 6.0.2 как часть объединения частично заполненных объектов с существующими полностью заполненными объектами, где нулевые значения частично заполненных объектов игнорируются. Мое использование настраиваемого распознавателя значений для игнорирования нулевых значений работает, но оно не работает, как я ожидаю, когда я пытаюсь настроить его так же, чтобы игнорировать списки нулевой длины.

Вот упрощенный код:

  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), а не к значению назначения (существующего объекта).

Может кто-нибудь помочь объяснить, что мне не хватает?

Приветствия

1 Ответ

0 голосов
/ 30 октября 2019

В вашем коде есть условие, что если 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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...