C#中如何通过DTO将BaseProduct的ImageBase集合转换为BaseImageReturn?
集合转换的实现方案
1. 手动遍历映射(基础通用)
先实现单个ImageBase到BaseImageReturn的转换方法,再遍历集合逐个转换:
// 单个对象转换方法 private BaseImageReturn MapImageBaseToBaseImageReturn(ImageBase imageBase) { return new BaseImageReturn { // 按实际属性一一对应赋值 Id = imageBase.Id, Url = imageBase.Url, AltText = imageBase.AltText // 其他属性依次补充 }; } // 完整的产品转换方法 public BaseProductCustomReturn MapBaseProductToCustomReturn(BaseProduct product) { var customReturn = new BaseProductCustomReturn { // 先映射BaseProduct的基础属性 Id = product.Id, Name = product.Name, Price = product.Price, // ... 其他基础属性 // 处理集合转换:遍历原集合,逐个转换后转为ICollection Images = product.Images.Select(MapImageBaseToBaseImageReturn).ToList() as ICollection<BaseImageReturn> }; return customReturn; }
如果需要严格的ICollection<T>实例,也可以用循环添加的方式:
var imageReturns = new List<BaseImageReturn>(); foreach(var img in product.Images) { imageReturns.Add(MapImageBaseToBaseImageReturn(img)); } customReturn.Images = imageReturns;
2. LINQ Select直接转换(简洁写法)
如果单个对象的转换逻辑简单,可直接在LINQ表达式内完成,无需单独抽方法:
public BaseProductCustomReturn MapBaseProductToCustomReturn(BaseProduct product) { return new BaseProductCustomReturn { Id = product.Id, Name = product.Name, // ... 其他基础属性 Images = product.Images.Select(img => new BaseImageReturn { Id = img.Id, Url = img.Url, AltText = img.AltText // 其他属性映射 }).ToList() as ICollection<BaseImageReturn> }; }
3. AutoMapper简化映射(多场景复用)
如果项目中有大量DTO转换需求,可使用AutoMapper配置映射规则,自动处理集合转换:
首先配置映射规则(通常在项目启动类或单独的映射配置类中):
var config = new MapperConfiguration(cfg => { // 自动匹配同名属性,属性名不同可通过ForMember手动配置 cfg.CreateMap<ImageBase, BaseImageReturn>(); cfg.CreateMap<BaseProduct, BaseProductCustomReturn>() .ForMember(dest => dest.Images, opt => opt.MapFrom(src => src.Images)); }); IMapper mapper = config.CreateMapper();
转换时直接调用即可:
var customReturn = mapper.Map<BaseProductCustomReturn>(product);
内容的提问来源于stack exchange,提问作者Modestas Vacerskas
相关产品推荐
相关产品推荐

