我试图映射源的结构,其中一些属性被一个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);
以上的设置是最接近我能得到,但它仍然抛出这个异常:
错误映射类型。
映射类型:源 - > DESTA映射Test.Program + SourceA - >映射Test.Program + DESTA
类型地图配置:SourceA - > DESTA MappingTest.Program + SourceA - > MappingTest.Program +德斯塔
目的地会员:子
任何人都知道一个简单的方法来做到这一点(记住,我应该能够自动生成使用T4模板映射配置,如果该事项的话)?
终于找到了一些作品。
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();