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

时间:2016-01-20 21:13:18

标签: c# linq automapper

使用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>());

(我是projecting from LINQ entities。我能找到的最接近的是使用custom type converter,但看起来我需要覆盖整个映射。)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

甚至重新映射它:

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