我正在尝试映射一个源结构,其中某些属性包含在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模板自动生成映射配置)?
答案 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();