【问题标题】:How to map from wrapped source properties to unwrapped destination如何从包装的源属性映射到未包装的目标
【发布时间】:2019-02-08 17:30:08
【问题描述】:

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

目标成员:子

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

【问题讨论】:

    标签: automapper


    【解决方案1】:

    终于找到了有用的东西。

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

    【讨论】:

    • 是的,可以将其设为通用 (CreateMap(typeof(NonNull&lt;&gt;), typeof(object))),但缺少正确的 ConvertUsing 重载。我会重新添加它,但在那之前您可以使用 AfterMap 解决它。您还必须在调用 map 时传递目标对象。
    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2014-03-19
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多