C#反射拼接HydronicEquipment列表结果异常如何解决
核心问题定位
- 原循环逻辑存在累加逻辑错误:代码中每次拼接操作都以初始定义的固定空集合
equipmentRedundancies为拼接源,完全没有把前一轮循环的拼接结果作为后续拼接的基础,相当于每轮都从空列表开始拼接当前属性对应的列表,循环结束后最终只会保留最后一个属性的内容,自然无法得到三个列表的完整拼接结果。 - 缺少空值防护:反射读取属性值后没有做非空判断,如果目标属性为null,强转得到null值时调用
Concat会直接抛出空引用异常。
修正后的实现代码
调整逻辑核心为持续累计拼接结果,同时增加反射取值的安全校验,修正后的GetRedundancyEquipment方法如下:
private static IEnumerable<IEquipmentRedundancy> GetRedundancyEquipment( HydronicEquipment hydronicEquipment, List<string> equipmentPropertyNames) { // 初始化累计拼接的结果集合,初始为空可枚举序列 var combinedResult = Enumerable.Empty<IEquipmentRedundancy>(); var targetType = typeof(HydronicEquipment); foreach (var propertyName in equipmentPropertyNames) { // 校验属性是否存在,避免传入不存在的属性名触发异常 var propertyInfo = targetType.GetProperty(propertyName); if (propertyInfo == null) continue; // 读取属性值并尝试转为目标可枚举类型 var currentList = propertyInfo.GetValue(hydronicEquipment, null) as IEnumerable<IEquipmentRedundancy>; // 属性值为空则直接跳过当前项 if (currentList == null) continue; // 将当前属性的列表拼接到累计结果中,完成累加 combinedResult = combinedResult.Concat(currentList); } return combinedResult; }
实现说明
- 累加逻辑改为每轮循环以上一轮的拼接结果为基础,和手动调用
Source.Concat(Distribution).Concat(Terminals)的执行逻辑完全一致 - 由于
LibraryHydronicEquipment实现了IEquipmentRedundancy接口,其List<LibraryHydronicEquipment>类型可以直接兼容IEnumerable<IEquipmentRedundancy>的强转,不需要额外做类型转换 - 不需要额外调用
ToList()强制物化集合,返回的延迟执行可枚举序列和常规手写拼接的行为保持一致 - 双重空校验可以覆盖属性名拼写错误、对应属性未赋值(为null)的边界场景,避免运行时异常
内容的提问来源于stack exchange,提问作者Glory Raj
相关产品推荐
相关产品推荐

