Использование Automapper для создания только аддитивной условной копии для каждого свойства - PullRequest
0 голосов
/ 14 октября 2019

У меня есть два объекта одного типа. Я хочу условно скопировать значения из objectA в objectB, используя Automapper (по сути, создавая только аддитивную копию между двумя объектами одного типа). Я смотрел на условное отображение и другие типы конвертеров, но я не хочу указывать это для каждого свойства объекта. Я хотел бы скопировать каждое свойство, используя точно такую ​​же логику.

  • Если исходное свойство имеет значение NULL, не копировать
  • Если цель уже имеет значение, не копируйте
  • Если цель имеет значение NULL, скопировать из источника
  • Если свойства источника и цели являются списком, то в список целей могут быть добавлены только отсутствующие элементы, поскольку цель может содержать элементы, отсутствующие в списке источников, которые должны остаться.

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

Мне кажется, что все, что мне нужно, - это возможность указать функцию, в которой autopper передает как исходные, так и целевые значения, и я могу просто принять решение на основе равенства между ними, используя вышеупомянутую логику.

    public static TOutput CopyAll<TInput, TOutput>(TInput input, TOutput output)
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<TInput, TOutput>().ForAllMembers(o => o.Condition((src, dest, srcValue, destValue) =>
            {
                return (srcValue != null && destValue == null);
            }));
        });

        IMapper mapper = config.CreateMapper();

        return mapper.Map<TInput, TOutput>(input, output);
    }
...