C#如何将列表类对象属性按规则映射到另一个类的对应属性
C# 不同类属性映射实现方案
方案1:硬编码Switch实现(性能最优,适合属性固定场景)
无需额外依赖,逻辑清晰易调试,运行效率最高。
public category MapCategoryListToCategory(IEnumerable<categoryList> categoryLists) { var result = new category(); foreach (var item in categoryLists) { // 跳过非法空值 if (string.IsNullOrWhiteSpace(item.categoryType) || string.IsNullOrWhiteSpace(item.categoryQuantity)) continue; // 转换数量为int类型 if (!int.TryParse(item.categoryQuantity, out var quantity)) continue; switch (item.categoryType.Trim()) { case "categoryA": result.categoryACount = quantity; break; case "categoryB": result.categoryBCount = quantity; break; case "categoryC": result.categoryCCount = quantity; break; case "categoryD": result.categoryDCount = quantity; break; } } return result; }
- 优势:性能无损耗,逻辑明确,排查问题简单,适合分类数量固定不会频繁新增的场景。
方案2:反射实现(扩展性强,适合属性频繁扩展场景)
通过属性名匹配自动赋值,后续新增分类无需修改映射逻辑。
public category MapCategoryListToCategoryByReflection(IEnumerable<categoryList> categoryLists) { var result = new category(); var categoryTypeInfo = typeof(category); foreach (var item in categoryLists) { // 跳过非法空值 if (string.IsNullOrWhiteSpace(item.categoryType) || string.IsNullOrWhiteSpace(item.categoryQuantity)) continue; if (!int.TryParse(item.categoryQuantity, out var quantity)) continue; // 按照规则拼接目标属性名 var targetPropertyName = $"{item.categoryType.Trim()}Count"; // 查找对应属性 var propertyInfo = categoryTypeInfo.GetProperty(targetPropertyName); // 属性存在且类型匹配才赋值 if (propertyInfo != null && propertyInfo.PropertyType == typeof(int?)) { propertyInfo.SetValue(result, quantity); } } return result; }
- 优势:后续新增分类只需给
category类新增对应categoryXCount属性即可自动完成映射,无需调整映射代码。
注意:如果
categoryType字段值存在大小写不一致的情况,可在匹配逻辑中增加忽略大小写的配置,避免匹配失败。
内容的提问来源于stack exchange,提问作者user16821841
相关产品推荐
相关产品推荐

