c# - AutoMapper——继承映射不​​工作,相同的源,多个目的地

标签 c# inheritance automapper automapper-2

我可以在 AutoMapper (v2.2) 中对源类型相同但目标类型不同的映射使用继承映射吗?

我有这样的基本情况(真正的类有更多的属性):

public abstract class BaseViewModel
{
    public int CommonProperty { get; set;}
}

public class ViewModelA : BaseViewModel
{
    public int PropertyA { get; set; }
}

public class ViewModelB : BaseViewModel
{
    public int PropertyB { get; set; }
}

ViewModelAViewModelB 是同一实体类的不同表示:

public class Entity
{
    public int Property1 { get; set; }
    public int Property2 { get; set; }
    public int Property3 { get; set; }
}

我想为每个 ViewModel 重用 BaseViewModel 的相同映射,例如:

Mapper.CreateMap<Entity, BaseViewModel>()
    .Include<Entity, ViewModelA>()
    .Include<Entity, ViewModelB>()
    .ForMember(x => x.CommonProperty, y => y.MapFrom(z => z.Property1));

Mapper.CreateMap<Entity, ViewModelA>()
    .ForMember(x => x.PropertyA, y => y.MapFrom(z => z.Property2));

Mapper.CreateMap<Entity, ViewModelB>()
    .ForMember(x => x.PropertyB, y => y.MapFrom(z => z.Property3));

但不幸的是,这似乎行不通。像这样的调用:

var model = Mapper.Map<Entity, ViewModelA>(entity);

导致 model 映射了 PropertyA,但没有 CommonProperty。我相信我正在遵循 https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance 中的示例正确,但我担心使用相同的源类型创建多个 map 会使 AutoMapper 出错。

有什么见解吗?我喜欢将基类映射组合在一起的想法,但这似乎行不通。

最佳答案

不幸的是,在这种情况下,AutoMapper 似乎只为每个源类型注册一个子类映射,最后一个 (ViewModelB)。这可能是设计用于并行层次结构,而不是单一源类型。

要解决这个问题,您可以将通用映射封装在扩展方法中:

public static IMappingExpression<Entity, TDestination> MapBaseViewModel<TDestination>(this IMappingExpression<Entity, TDestination> map)
  where TDestination : BaseViewModel { 
  return map.ForMember(x => x.CommonProperty, y => y.MapFrom(z => z.Property1));
}

并在各个子类映射中使用它:

Mapper.CreateMap<Entity, ViewModelA>()
  .MapBaseViewModel<ViewModelA>()
  .ForMember(x => x.PropertyA, y => y.MapFrom(z => z.Property2));

Mapper.CreateMap<Entity, ViewModelB>()
  .MapBaseViewModel<ViewModelB>()
  .ForMember(x => x.PropertyB, y => y.MapFrom(z => z.Property3));

关于c# - AutoMapper——继承映射不​​工作,相同的源,多个目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13994081/

相关文章:

c# - dapper 执行存储过程时将数据类型日期时间转换为小日期时间时出错

具有非自动属性的 C# 匿名支持字段

c++ - 虚拟与纯虚拟基类函数和从 dll 导出

c# - 具有下划线/PascalCase 属性的 Automapper 命名约定

c# - 使用反射设置对象属性

C++ 继承 : Calling Base Class Constructor In Header

C#:覆盖返回类型

c# - AutoMapper 映射到基于枚举的不同类型?

automapper - AutoMapper字典拼合

c# - 是否可以使用 C# 对 FTP 中的文件夹进行 ZIP 压缩?