You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何获取Jira Issue自定义字段Non-Public成员中的Sprint名称值

解决方案

问题原因

你写的反射代码返回null的核心原因是 BindingFlags 是位枚举,仅传入 BindingFlags.NonPublic 不会匹配实例成员,必须同时指定 BindingFlags.Instance 才能正确读取非公有实例成员/属性。

实现步骤

  1. 先确认目标成员名称
    先执行以下代码输出所有非公有实例成员,找到存储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名称的成员名
}
  1. 读取非公有成员值
    根据你查到的成员类型(字段/属性)调用对应方法:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 04:33:02