Automapper将继承的对象映射到子级

时间:2016-06-02 07:34:24

标签: c# automapper

我有以下课程:

来源:

public class Source
{
    public int Amount { get; set; }
}

目的地:

public class Parent
{
    public ChildBase Child { get; set; }
}

public class ChildBase
{

}

public class Child : ChildBase
{
    public int Amount { get; set; }
}

对于我尝试创建的地图,我想从Source映射到ParentParent上的媒体资源定义为ChildBase,但我希望地图实际映射到Child。如何让映射器映射到Child

我有一个简单的地图定义为:

CreateMap<Source, Parent>()
  .ForMember(d => d.Child, opt => opt.MapFrom(s => s));

CreateMap<Source, Child>();

但显然这是在寻找目的地为ChildBase的地图。我尝试将目标转换为Child,但这并不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您需要在AutoMapper中使用自定义ValueResolver

Mapper.CreateMap<Source, Parent>()
    .ForMember(p => p.Child, o => o.ResolveUsing(s => new Child { Amount = s.Amount }));

如果要重用此逻辑,可以将代码放入类而不是lambda表达式。

class SourceToChildValueResolver : ValueResolver<Source, Child>
{
    protected override Child ResolveCore(Source source)
    {
        return new Child { Amount = source.Amount };
    }
}

//register the resolver
CreateMap<Source, Parent>()
    .ForMember(p => p.Child, o => o.ResolveUsing<SourceToChildValueResolver>());