使用PropertyInfo.GetValue()获取SortedSet<T>类型属性值的问题
解决反射获取SortedSet属性的问题
核心问题排查
你遇到的ArgumentNullException大概率是反射获取属性值时拿到了null,而直接调用Machine.ToString()正常是因为该方法内部做了集合非空判断或触发了数据加载(比如ORM延迟加载)。直接打印属性值显示类型名是因为SortedSet<T>的默认ToString()就是输出类型全称。
具体解决步骤
确认反射调用的正确性
确保获取PropertyInfo时属性名拼写正确,且调用GetValue时传入了有效的Machine实例(不能传null):// 正确示例 Machine targetMachine = GetYourMachineInstance(); // 从数据库拉取的有效实例 PropertyInfo prop = typeof(Machine).GetProperty("SubAssemblies"); if (prop == null) { throw new InvalidOperationException("未找到SubAssemblies属性"); } var subAssemblies = prop.GetValue(targetMachine) as SortedSet<SubAssembly>;处理非空判断与集合遍历
拿到属性值后先做非空校验,再按需求遍历或格式化输出,避免直接打印集合对象:if (subAssemblies != null) { // 方式1:遍历输出每个元素 foreach (var sub in subAssemblies) { Console.WriteLine(sub.ToString()); // 假设SubAssembly重写了ToString } // 方式2:用字符串拼接输出,和Machine.ToString()逻辑对齐 string formatted = $"SubAssemblies: {string.Join(", ", subAssemblies)}"; Console.WriteLine(formatted); } else { Console.WriteLine("SubAssemblies集合为空"); }应对ORM延迟加载场景
如果你的SortedSet<SubAssembly>是ORM(比如EF)的延迟加载集合,反射获取时可能还未触发数据加载,而Machine.ToString()的遍历操作触发了加载。这种情况下可以手动强制加载:if (subAssemblies is IQueryable queryable) { queryable.Load(); // 需要引用对应ORM的扩展方法,比如EF的System.Data.Entity.EntityFrameworkExtensions }
额外注意
如果Machine类的ToString()是自定义实现的,你可以直接复用其逻辑来格式化反射获取的集合,避免重复代码。
内容的提问来源于stack exchange,提问作者BMET1
相关产品推荐
相关产品推荐

