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
类型 Map 配置:SourceA -> DestA MappingTest.Program+SourceA -> MappingTest.Program+DestA
目的地成员:子
任何人都知道执行此操作的简单方法(请记住,我应该能够使用 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();
推荐阅读
- pytest - 知道为什么用 @pytest.mark.flaky(max_runs=...) 装饰的失败测试不会触发片状插件
- shell - 可以将 Jenkins 参数(变量)直接传递到 shell 脚本中吗?
- wordpress - WooCommerce 挂钩 - 产品更新提供变体对象而不是 ID
- python - 在pyhon中加载json时没有数据
- c - 我一直在我的 Mac 中使用 Visual Studio Code。当我尝试编译和运行程序时,它会弹出一条消息“权限被拒绝”
- java - 如何找到两个日期之间的小时差?
- python - 如何修复孪生错误“CRITICAL:root:twint.get:User:replace() argument 2 must be str, not None”
- apache-kafka - 分区重新平衡期间的 Kafka 行为
- javascript - 同名的变量和函数在块内返回错误
- sql - 查询选择不同登录的问题