使用自动映射程序覆盖解析的属性类型
本文关键字:属性 类型 覆盖 映射程序 | 更新日期: 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));