如何用AutoMapper将IEnumerable<Contract>扁平映射为IEnumerable<MyClass>
使用AutoMapper将IEnumerable映射为扁平化的IEnumerable
要实现把所有Contract实例中的InnerClass对象合并转换为MyClass集合,需要分两步配置AutoMapper:
1. 配置InnerClass到MyClass的字段映射
因为目标类属性名和源类不一致,需要显式指定成员映射规则:
public class MappingProfile : Profile { public MappingProfile() { // 映射InnerClass到MyClass,处理属性名差异 CreateMap<InnerClass, MyClass>() .ForMember(dest => dest.IdWithDifferentName, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.ValueWithDifferentName, opt => opt.MapFrom(src => src.Value));
2. 配置集合的扁平化映射
自定义IEnumerable<Contract>到IEnumerable<MyClass>的转换逻辑,通过SelectMany展开所有Contract中的MyConfig集合,再逐个转换为MyClass:
// 自定义集合映射,扁平化所有InnerClass并转换 CreateMap<IEnumerable<Contract>, IEnumerable<MyClass>>() .ConvertUsing((source, _, context) => source // 处理MyConfig可能为null的情况,避免空引用异常 .SelectMany(contract => contract.MyConfig ?? Enumerable.Empty<InnerClass>()) .Select(inner => context.Mapper.Map<MyClass>(inner)) ); } }
初始化AutoMapper并调用
在应用启动时注册映射配置:
var mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile<MappingProfile>(); }); IMapper mapper = mapperConfig.CreateMapper();
之后即可用你原本的调用方式完成映射:
var configs = mapper.Map<IEnumerable<MyClass>>(response);
内容的提问来源于stack exchange,提问作者PMO1948
相关产品推荐
相关产品推荐

