首页 > 解决方案 > 如何从包装的源属性映射到未包装的目标

问题描述

我正在尝试映射一个源结构,其中一些属性包含在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

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

目的地成员:子

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

标签: automapper

解决方案


终于找到了有用的东西。

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

推荐阅读