使用自动映射程序覆盖解析的属性类型

本文关键字:属性 类型 覆盖 映射程序 | 更新日期: 2023-09-27 18:31:09

使用自动映射器,我可以覆盖属性的解析类型吗?例如,给定这些类:

public class Parent
{
    public Child Value { get; set; }
}
public class Child { ... }
public class DerivedChild : Child { ... }

是否可以将自动映射程序配置为使用 DerivedChild 实例自动映射 Child Value 属性?假设的映射如下所示:

map.CreateMap<ChildEntity, DerivedChild>();
map.CreateMap<ParentEntity, Parent>()
   .ForMember(p => p.Value, p => p.UseDestinationType<DerivedChild>());

(我正在从 LINQ 实体投影。我能找到的最接近的是使用自定义类型转换器,但看起来我需要覆盖整个映射。

使用自动映射程序覆盖解析的属性类型

这里有一种方法可以做到这一点:

map.CreateMap<ChildEntity, DerivedChild>();
map.CreateMap<ParentEntity, Parent>()
    .ForMember(
        x => x.Value,
        opt => opt.ResolveUsing(
            rr => map.Map<DerivedChild>(((ParentEntity)rr.Context.SourceValue).Value)));

ResolveUsing允许指定用于映射值的自定义逻辑。

这里使用的自定义逻辑实际上是调用map.Map映射到DerivedChild

您可以在映射后手动重新分配新对象:

Mapper.CreateMap<ParentEntity, Parent>()
    .AfterMap((src, dest) => dest.Value =  new DerivedChild(){...});

甚至重新映射它:

   .AfterMap((src, dest) => dest.Value = Mapper.Map<DerivedChild>(dest.Value));