如何在AutoMapper自定义TypeConverter中复用自动映射与ForMember逻辑?
AutoMapper 独立转换器实现(保留自动映射+特殊属性配置)
- 首先修正转换器的泛型参数,你需要实现的是
ITypeConverter<Order, OrderDto>,而非原代码中的ITypeConverter<OrderEntity, Order>。 - 转换器属于映射执行阶段,不需要也不能调用
CreateMap(这是配置阶段API)。要保留自动映射同名同类型属性的逻辑,可通过ResolutionContext中的Mapper先完成基础属性映射,再手动处理特殊属性。
正确的转换器代码
public class OrderModelTypeConverter : ITypeConverter<Order, OrderDto> { public OrderDto Convert(Order source, OrderDto destination, ResolutionContext context) { // 初始化目标对象(如果传入null的话) destination = destination ?? new OrderDto(); // 让AutoMapper自动映射所有匹配的属性 context.Mapper.Map(source, destination); // 替换原ForMember中的特殊属性处理逻辑 // 示例:处理Name属性 destination.Name = /* 你的自定义逻辑,比如source.Customer.Name + source.OrderNo */; // 示例:处理Points属性 destination.Points = /* 你的自定义计算逻辑,比如source.TotalAmount * 0.1 */; return destination; } }
Profile中的配置
// 在AutoMappingProfiles中只需配置一行即可复用转换器逻辑 CreateMap<Order, OrderDto>().ConvertUsing(new OrderModelTypeConverter());
补充说明
- 如果特殊属性涉及嵌套对象转换,也可以通过
context.Mapper.Map复用其他已配置的映射规则,比如destination.UserInfo = context.Mapper.Map<UserInfoDto>(source.User); - 这种实现方式既保留了AutoMapper自动映射的便捷性,又将自定义逻辑封装在独立类中,方便跨项目直接引用复用。
内容的提问来源于stack exchange,提问作者dave101ua
相关产品推荐
相关产品推荐

