使用AutoMapper覆盖已解析的属性类型

3
使用AutoMapper,我可以覆盖属性的解析类型吗?例如,给定这些类:
public class Parent
{
    public Child Value { get; set; }
}

public class Child { ... }
public class DerivedChild : Child { ... }

我可以配置AutoMapper来将Child Value属性自动映射到一个DerivedChild实例吗?假设的映射将类似于以下内容:
map.CreateMap<ChildEntity, DerivedChild>();
map.CreateMap<ParentEntity, Parent>()
   .ForMember(p => p.Value, p => p.UseDestinationType<DerivedChild>());

我正在从LINQ实体进行投影。我找到的最接近的方法是使用自定义类型转换器,但似乎我需要覆盖整个映射。


你能展示一下 ParentEntity 类吗? - Yacoub Massad
@YacoubMassad 假设 ParentEntity 看起来就像 Parent(带有一个 ChildEntity Value 属性),因此我们可以按照惯例自动映射它。实际模型更加复杂,使用映射表达式,但这不会影响问题。 - Pathoschild
2个回答

1
您可以在映射后手动重新分配新的对象:
Mapper.CreateMap<ParentEntity, Parent>()
    .AfterMap((src, dest) => dest.Value =  new DerivedChild(){...});

甚至重新映射它:
   .AfterMap((src, dest) => dest.Value = Mapper.Map<DerivedChild>(dest.Value));

1
这是一种方法:
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


我很高兴我能帮助到您。 - Yacoub Massad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接