假设我有以下
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未映射等)
有没有办法解决这个问题?
答案 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())
- 继承的显式映射
- 忽略属性映射
- 约定映射(通过约定匹配的属性)
虽然,老实说,这可能不是你想要的。