C#调用Azure DevOps Rest API跳过null值遍历数据问题咨询
问题根因
程序无报错终止的核心原因是,当某条修订记录未变更System.ChangedDate字段时,接口返回的fields集合中不存在该字段,反序列化后m.fields.SystemChangedDate本身为null,直接访问其newValue属性会触发未捕获的空引用异常,导致程序直接退出,而非逻辑上的停止遍历。
可行解决方案
方案1:使用C#空条件运算符逐层判空(最简单)
利用?.运算符判断每层对象是否为null,只要任意一层为空就会直接返回null,不会触发异常:
var updateid = RestAPI.GetUpdates(id); Console.WriteLine("Count: " + updateid.count); foreach (var m in updateid.value) { Console.WriteLine("id: " + m.id); Console.WriteLine("rev: " + m.rev); // 逐层判空,避免空引用异常 if (m.fields?.SystemChangedDate?.newValue != null) { Console.WriteLine("ChangedDate: " + m.fields.SystemChangedDate.newValue); } }
方案2:增加单节点异常捕获(更稳妥)
如果还有其他未知的字段缺失场景,可以给单个循环项的逻辑包裹异常捕获,确保单节点处理失败不会中断整个遍历流程:
var updateid = RestAPI.GetUpdates(id); Console.WriteLine("Count: " + updateid.count); foreach (var m in updateid.value) { try { Console.WriteLine("id: " + m.id); Console.WriteLine("rev: " + m.rev); string changedDate = m.fields?.SystemChangedDate?.newValue?.ToString(); if (!string.IsNullOrEmpty(changedDate)) { Console.WriteLine("ChangedDate: " + changedDate); } } catch (Exception ex) { // 可打印异常信息排查问题,不影响后续节点处理 Console.WriteLine($"处理rev={m.rev}节点失败:{ex.Message}"); } }
方案3:用字典存储fields集合(适配接口特性)
Azure DevOps的更新接口只会返回本次修订发生变更的字段,所以可以把反序列化类中的fields属性修改为Dictionary<string, 你的FieldChange类>类型,通过判断键是否存在来避免访问不存在的字段:
// 先修改WorkItemUpdate类的fields定义 // public Dictionary<string, FieldChange> fields { get; set; } // 遍历逻辑 foreach (var m in updateid.value) { Console.WriteLine("id: " + m.id); Console.WriteLine("rev: " + m.rev); if (m.fields != null && m.fields.TryGetValue("System.ChangedDate", out var changeField) && changeField.newValue != null) { Console.WriteLine("ChangedDate: " + changeField.newValue); } }
内容的提问来源于stack exchange,提问作者yancy
相关产品推荐
相关产品推荐

