Automapper使用嵌套基类和两个子类型来展平Dto

时间:2018-05-08 20:42:40

标签: c# automapper

基于我见过的所有示例,我希望现在已经解决了这个问题,但由于某种原因无法使映射正常工作。我一直收到Missing type map configuration or unsupported mapping.例外。使用Automapper 4.2.1

以下是我的课程:

public class Schedule
{
  public ScheduleData ScheduleData { get; set; }
}

// Base type
public abstract class ScheduleData {}

// Sub Types
public class ActionItemScheduleData : ScheduleData {}
public class FormScheduleData : ScheduleData {}

这是映射。我采用了AfterMap()方法,并按类型打破了映射。我不认为我必须这样做,但是当我刚刚映射基类型时,我得到了上述错误。即使使用if / else的这种方法,我仍然会得到错误。这是由于我的Automapper版本吗?

public class ScheduleMapper : Profile
{
    protected override void Configure()
    {
        CreateMap<ActionItemScheduleData, ScheduleDto>(MemberList.Destination)
            .ForMember(x => x.Name, c => c.MapFrom(m => m.ActionDescription));

        CreateMap<MobileFormScheduleData, ScheduleDto>(MemberList.Destination)
            .ForMember(x => x.Name, c => c.MapFrom(m => m.Description));

        CreateMap<Schedule, ScheduleDto>(MemberList.Destination)
            .AfterMap((s, d) => 
            {
                if (s.ScheduleData is MobileFormScheduleData)
                {
                    Mapper.Map((MobileFormScheduleData) s.ScheduleData, d);
                }
                else
                {
                    Mapper.Map((ActionItemScheduleData) s.ScheduleData, d);
                }
           });

    }
}

这就是我所说的:

 var scheduleDto = mapper.Map<ScheduleDto>(schedule);

1 个答案:

答案 0 :(得分:0)

我通过以下代码对其进行了解决:

CreateMap<Schedule, ScheduleDto>().ForMember(t => t.ScheduleData, opt => opt.Ignore()).AfterMap((s, t, c) => 
            {
                t.ScheduleData = c.Mapper.Map<MobileFormScheduleData, ScheduleDto>((MobileFormScheduleData)s.ScheduleData )
           });