Automapper 5.1.1继承映射

Automapper 5.1.1 inheritance mapping

您好,我无法让我的映射适用于继承 class。 想法是只为基对象和接口创建映射一次,当子classes实现自己的成员时,只为那些没有在基class或intrface.[=13中定义的成员配置映射。 =]

让我从示例代码开始。

public class DtoClass {
   public string Field1 { get; set; }
   public string Field2 { get; set; }
   public string Field3 { get; set; }
}

public interface IField3 {
   public string EntityField3 { get; set; }
}

public class BaseEntityClass {
   public string EntityField1 { get; set; }
}

public class ChildEntityClass : BaseEntityClass, IField3  {
   public string EntityField2 { get; set; }
   public string EntityField3 { get; set; }
}


CreateMap<BaseEntityClass, DtoClass>()
   .ForMember(c => c.Field1 , m => m.MapFrom(a => a.EntityField1))
   .Include<ChildEntityClass, DtoClass>();

CreateMap<IField3, DtoClass>()
   .ForMember(c => c.Field3 , m => m.MapFrom(a => a.EntityField3));

CreateMap<ChildEntityClass, DtoClass>()
   .ForMember(c => c.Field2 , m => m.MapFrom(a => a.EntityField2));

附加代码当然不起作用。打电话时:

AutoMapper.Mapper.Map<ChildEntityClass, DtoClass>(instanceOfChildEntityClass);

我只得到在 CreateMap<ChildEntityClass, DtoClass>().

中定义的映射成员

知道如何只为基础 class 和接口实现一次映射吗? 是的,我想将所有类型的 ChildEntityClass、BaseEntityClass 和 IField3 映射到 DtoClass。

欢迎任何关于优雅配置此类映射的提示。

编辑:为了清楚起见,我从子class中删除了不必要的 Incssary IncludeBase,但是none
- subclass 中的 IncludeBase - 包含在基础中 class 为我工作。什么会导致此类问题?

您不应该使用 .IncludeBase.Include - 选择一个并坚持使用。我更喜欢 .IncludeBase,因为我认为在子类中定义更有意义。在您的情况下,您不能使用 Include 引用 IField3,因为没有隐式转换。

以下代码对我来说使用 IncludeBase

CreateMap<BaseEntityClass, DtoClass>()
    .ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.EntityField1))
    ;

CreateMap<IField3, DtoClass>()
    .ForMember(dest => dest.Field3, opt => opt.MapFrom(src => src.EntityField3))
    ;

CreateMap<ChildEntityClass, DtoClass>()
    .ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.EntityField2))
    .IncludeBase<BaseEntityClass, DtoClass>()
    .IncludeBase<IField3, DtoClass>()
    ;

因为问题经常发生在我在示例代码中提供的范围之外。

在我的项目中,初始化方法中隐藏了类似以下内容的调用:

        foreach (string propName in map.GetUnmappedPropertyNames())
        {
            expr.ForMember(propName, opt => opt.Ignore());
        }

因此,即使在为基类型调用映射时,所有未映射到子类中的列也会被自动忽略。简单但有问题。

上面的代码可能是为了Mapper.Configuration.AssertConfigurationIsValid();通过而添加的。