Automapper 5.1.1继承映射

时间:2016-10-31 14:58:31

标签: c# inheritance automapper automapper-5

您好我无法让我的映射为继承的类工作。 想法是只为基础对象和接口创建一次映射,当子类实现自己的成员时,为那些未在基类或基础中定义的成员配置映射。

让我先从示例代码开始。

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));

附加代码dosnt工作的课程。在打电话时:

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

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

中定义的映射成员

任何想法如何只为基类和接口实现一次映射? 是的,我想将所有类型ChildEntityClass,BaseEntityClass和IField3映射到DtoClass。

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

编辑:为清楚起见,我从子类中移除了不受欢迎的IncludeBase,但两者都没有   - 子类中的IncludeBase   - 包括在基类中 适合我。什么会导致这样的问题?

2 个答案:

答案 0 :(得分:0)

你不应该使用.IncludeBase AND .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>()
    ;

答案 1 :(得分:0)

由于经常发生问题超出了我在示例代码中提供的范围。

在我的初始化方法项目中隐藏了类似的调用:

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

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

上面的代码可能是Mapper.Configuration.AssertConfigurationIsValid();传递的。