首页 > 解决方案 > Automapper通过函数反向映射

问题描述

在简化的源 Device.cs 中,我有:

using Assisticant.Collections;

(...)

private ObservableList<Result> _results = new ObservableList<Result>();

public IEnumerable<Result> Results
{
   get { return _results; }
}

public void AddResult(Result result)
{
    _results.Add(result);
}

目标 DeviceDto.cs 是:

public List<Result> Results { get; set; }

我应该如何配置 Automapper 以进行从源到目标的简单直接映射,同时通过.AddResult(result)函数对每个元素进行反向映射?(由于使用了库的目的,我必须以这种方式添加元素)

我应该添加什么:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Device, DeviceDto>().ReverseMap();
});

_mapper = new Mapper(config);

标签: c#automapper

解决方案


不要使用ReverseMap(),而是显式地配置从DeviceDto到的映射Device

因为Device.Results只定义了一个 getter,所以在映射步骤中它会被 AutoMapper 忽略。AfterMap如果您需要同时访问源和目标,请使用该方法。

using System.Linq;

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Device, DeviceDto>();
    cfg.CreateMap<DeviceDto, Device>()
        .AfterMap((src, dst) => src.Results.Select(result => dst.AddResult(result)));
});

推荐阅读