You need to enable JavaScript to run this app. C#反射拼接HydronicEquipment列表结果异常如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 22:15:06