如何配置Mapster,使其通过A->B与B->C映射实现A->C转换?
可以通过Mapster的链式映射实现A->C的转换
是的,你完全可以配置Mapster复用已有的A->B和B->C映射规则,通过A→B→C的路径完成A到C的转换,无需单独编写A与C的直接映射配置。
实现方法
在你的AddMappings方法中,为A→C添加一个映射配置,明确指定通过先转换为B再转换为C的方式完成映射:
public void AddMappings() { // 已有的A→B映射 TypeAdapterConfig<A, B> .ForType() .Map(dest => dest.Value1, src => ConvertToInt(src.Value1)); // 已有的B→C映射 TypeAdapterConfig<B, C> .ForType() .Map(dest => dest.Value2, src => ConvertToInt(src.Value2)); // 新增A→C的链式映射配置 TypeAdapterConfig<A, C> .ForType() .MapWith(src => src.Adapt<B>().Adapt<C>()); }
原理说明
- 当调用
a.Adapt<C>()时,Mapster会先使用你已配置的A→B规则将A对象转换为B对象,其中Value1会通过ConvertToInt完成字符串到整数的转换。 - 接着,再使用已配置的B→C规则将B对象转换为C对象,此时
Value2会通过ConvertToInt完成字符串到整数的转换。 - 这种方式完全复用了已有的映射逻辑,避免了重复编写属性映射代码。
验证示例
假设你有一个A对象:
var a = new A { Value1 = "123", Value2 = "456" };
调用转换后:
var c = a.Adapt<C>(); // c.Value1 会是 123(来自A→B的转换) // c.Value2 会是 456(来自B→C的转换)
这样就完全符合你的需求,无需单独配置A与C的直接映射。
内容的提问来源于stack exchange,提问作者Sidereus
相关产品推荐
相关产品推荐

