如何从包装的源属性映射到未包装的目标

时间:2019-02-08 08:28:53

标签: automapper

我正在尝试映射一个源结构,其中某些属性包含在NonNull<T>泛型类型中(来自GraphQL.Conventions库)。

在实践中,我想使用AutoMapper映射结构:

public class SourceA
{
    public NonNull<SourceB> Sub { get; set; }

    public string Username { get; set; }
}

public class SourceB
{
    public NonNull<string> Address { get; set; }
}

到这样的目的地:

public class DestA
{
    public DestB Sub { get; set; }

    public string Username { get; set; }
}

public class DestB
{
    public string Address { get; set; }
}

这是我的设置:

var source = new NonNull<SourceA>(new SourceA
{
    Username = "Test user",
    Sub = new NonNull<SourceB>(new SourceB
    {
        Address = "Test Address"
    })
});

var mapper = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<SourceA, DestA>();
    cfg.CreateMap<NonNull<SourceA>, DestA>()
        .ConvertUsing((src, dst, ctx) =>
        {
            ctx.Mapper.Map(src.Value, dst);
            return dst;
        });
    cfg.CreateMap<SourceB, DestB>();
    cfg.CreateMap<NonNull<SourceB>, SourceB>()
        .ConvertUsing((src, dst, ctx) =>
        {
            ctx.Mapper.Map(src.Value, dst);
            return dst;
        });
}).CreateMapper();


var dest = mapper.Map<DestA>(source);

上面的设置是我能得到的最接近的设置,但是它仍然抛出此异常:

  

错误映射类型。

     

映射类型:SourceA-> DestA MappingTest.Program + SourceA->   MappingTest.Program + DestA

     

类型映射配置:SourceA-> DestA MappingTest.Program + SourceA   -> MappingTest.Program + DestA

     

目标成员:Sub

任何人都知道执行此操作的简单方法(请记住,如果有关系的话,我应该能够使用T4模板自动生成映射配置)?

1 个答案:

答案 0 :(得分:0)

最后找到了可行的方法。

var mapper = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<SourceA, DestA>();
    cfg.CreateMap<NonNull<SourceA>, DestA>().ConvertUsing((src, dst, ctx) => ctx.Mapper.Map<DestA>(src.Value));
    cfg.CreateMap<SourceB, DestB>();
    cfg.CreateMap<NonNull<SourceB>, DestB>().ConvertUsing((src, dst, ctx) => ctx.Mapper.Map<DestB>(src.Value));
}).CreateMapper();