具有2个具体类的Automapper Map接口到另一个类

时间:2017-10-02 17:09:36

标签: c# automapper

假设我有以下

public interface IPerson {
    public string Name { get; set; }
}

public class Student : IPerson{
    public string Name {get;set;}
    public string StudentId {get;set;}
}

public class Professor : IPerson {
    public string Name {get;set;}
    public string ProfessorId {get;set;}
}

public class PersonDto {
    public string Name {get;set;}
    public string StudentId {get;set;}
    public string ProfessorId {get;set;}
}

但现在我创建地图

class MyMapperProfile : Profile{
    CreateMap<Student, PersonDto>()
        .ForMember(s => s.ProfessorId, s=> s.Ignore());
    CreateMap<Student, PersonDto>()
        .ForMember(s => s.StudentId, s=> s.Ignore());

    CreateMap<IPerson, PersonDto>()
        .Include<Student, PersonDto>()
        .Include<Professor, PersonDto>();
}

我注意到地图不起作用(不映射)。事实上,我在验证地图时遇到错误(StudentId未映射等)

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

以下映射配置应该有效。请注意,您没有在示例中为教授创建映射(可能是复制粘贴错误)。

        CreateMap<Student, PersonDto>()
            .ForMember(s => s.StudentId, o => o.MapFrom(x => x.StudentId))
            .ForMember(s => s.ProfessorId, o => o.Ignore());

        CreateMap<Professor, PersonDto>()
            .ForMember(s => s.ProfessorId, o => o.MapFrom(x => x.ProfessorId))
            .ForMember(s => s.StudentId, o => o.Ignore());

        CreateMap<IPerson, PersonDto>()
            .ForMember(s => s.StudentId, o => o.Ignore())
            .ForMember(s => s.ProfessorId, o => o.Ignore())
            .Include<Student, PersonDto>()
            .Include<Professor, PersonDto>();

另请注意,我在此处明确设置字段。请参阅Specifying inheritance in derived classes,特别是以下部分:

  

继承映射优先级

     

这引入了额外的复杂性,因为可以通过多种方式映射属性。这些来源的优先顺序如下

     
      
  • 显式映射(使用.MapFrom())
  •   
  • 继承的显式映射
  •   
  • 忽略属性映射
  •   
  • 约定映射(通过约定匹配的属性)
  •   

虽然,老实说,这可能不是你想要的。