在源是应根据源上的值映射到两个派生类之一的类的情况下,我无法实现 Automapper 转换。
这是我的课程的简化:
public class FooContainerDTO
{
public FooDTO Foo { get; set; }
}
public class FooDTO
{
public string Type { get; set; }
//some properties..
}
public class FooContainer
{
public FooBase Foo { get; set; }
}
public abastract class FooBase
{
//some properties..
}
public class FooDerived1 : FooBase
{
//some properties
}
public class FooDerived2 : FooBase
{
//some properties
}
我使用的是非静态 Automapper,因此我在启动时从多个配置文件创建 MapperConfiguration,并将 IMapper 实例注入我的 DI 容器。我希望 Automapper 在其 Type 属性为“der1”时将 FooDTO 映射到 FooDerived1,并在其为“der2”时将其映射到 FooDerived2。
我已经看到了使用静态 api 的示例,如下所示:
Mapper.CreateMap<FooContainerDTO, FooContainer>();
//ForMember configurations etc.
Mapper.CreateMap<FooDTO, FooDerived1>();
//ForMember configurations etc.
Mapper.CreateMap<FooDTO, FooDerived2>();
//ForMember configurations etc.
Mapper.CreateMap<FooDTO, FooBase>()
.ConvertUsing(dto => dto.Type == "der1"
? (FooBase) Mapper.Map<FooDerived1>(dto)
: Mapper.Map<FooDerived2>(dto));
这会将 FooContainer 的 Foo 属性映射到 FooBase 的正确派生类型。
但是如果没有静态 API,我怎么能做到这一点呢?在配置配置文件时,IMapper 实例尚未创建。有没有办法利用需要 Func< ResolutionContext,object > 的 ConvertUsing() 的重载?分辨率上下文可以给我当前正在使用的任何 IMapper 吗?我一直在寻找,但找不到任何可用的东西。