C#如何获取Jira Issue自定义字段Non-Public成员中的Sprint名称值
解决方案
问题原因
你写的反射代码返回null的核心原因是 BindingFlags 是位枚举,仅传入 BindingFlags.NonPublic 不会匹配实例成员,必须同时指定 BindingFlags.Instance 才能正确读取非公有实例成员/属性。
实现步骤
- 先确认目标成员名称
先执行以下代码输出所有非公有实例成员,找到存储Sprint名称的字段/属性的准确命名:
var sprintValue = issue.CustomFields.FirstOrDefault(f => f.Id == customFieldMapping.SprintNameId)?.Values?.FirstOrDefault(); if (sprintValue != null) { var allMembers = sprintValue.GetType().GetMembers(BindingFlags.Instance | BindingFlags.NonPublic); // 调试查看allMembers数组,找到对应Sprint名称的成员名 }
- 读取非公有成员值
根据你查到的成员类型(字段/属性)调用对应方法:
var sprintValue = issue.CustomFields.FirstOrDefault(f => f.Id == customFieldMapping.SprintNameId)?.Values?.FirstOrDefault(); if (sprintValue != null) { // 若目标为私有字段 var sprintField = sprintValue.GetType().GetField("你查到的字段名", BindingFlags.Instance | BindingFlags.NonPublic); string sprintName = sprintField?.GetValue(sprintValue)?.ToString(); // 若目标为私有属性,替换为以下代码 // var sprintProp = sprintValue.GetType().GetProperty("你查到的属性名", BindingFlags.Instance | BindingFlags.NonPublic); // string sprintName = sprintProp?.GetValue(sprintValue)?.ToString(); }
更稳定的替代方案
Jira的Sprint自定义字段值通常为特殊格式的序列化字符串,格式类似com.atlassian.greenhopper.service.sprint.Sprint@123456[id=123,name=迭代1,state=ACTIVE,...],你可以直接通过正则匹配提取名称,不受类内部结构变更影响:
var sprintValue = issue.CustomFields.FirstOrDefault(f => f.Id == customFieldMapping.SprintNameId)?.Values?.FirstOrDefault()?.ToString(); if (!string.IsNullOrEmpty(sprintValue)) { var match = System.Text.RegularExpressions.Regex.Match(sprintValue, @"name=([^,]+)"); if (match.Success) { string sprintName = match.Groups[1].Value; } }
内容的提问来源于stack exchange,提问作者chrysanthi
相关产品推荐
相关产品推荐

