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

Scriban模板中如何访问自定义C# Dictionary迭代器?

问题描述

我有一个Dictionary<string, object>,想动态格式化其中的对象,这个操作在控制台里能正常运行,但在Scriban模板里访问这些值时出了问题。

我的自定义迭代器代码如下:

public class Workflow {
    public Dictionary<string, object>? Variables { get; set; }
    public IEnumerable<(string key, string value)> GetVariables() {
        foreach (var kvp in Variables) {
            yield return (kvp.Key, FormatUtils.FormatVariable(kvp.Value));
        }
    }
}

传递给渲染器的方式:

template.Render(new {
     variables = workflow.GetVariables()
});

尝试在Scriban模板中访问键值:

{{~ for var in variables ~}}
  {{ var.key }}: {{ var.value }} 
{{~ end ~}}

直接传Variables时代码能正常运行,但现在没有任何输出,还提示key和value未定义。在Scriban里variables的输出是:

[(JOB_NUMBER, 42), (JOB_DESC, "New Car")]

而直接传递Variables时的输出是:

[{key: "JOB_NUMBER", value: 42}, {key: "JOB_DESC", value: "New Car"}]

请问该如何修复值的访问问题?

解决方案

问题出在你传递的是C#的值元组(Value Tuple),Scriban默认无法直接识别值元组的命名成员(key和value),它会把值元组当成普通的无命名元组处理。

你有两种修复方式:

方式一:将值元组转换为匿名对象

修改GetVariables方法,返回匿名对象的枚举,而不是值元组:

public IEnumerable<object> GetVariables() {
    foreach (var kvp in Variables) {
        yield return new { 
            key = kvp.Key, 
            value = FormatUtils.FormatVariable(kvp.Value) 
        };
    }
}

这样传递给Scriban的结构就和直接传Variables时的格式一致,模板里的var.key和var.value就能正常访问。

方式二:在Scriban模板中通过索引访问元组元素

值元组在Scriban中会被处理成有序的元组,你可以通过索引0和1来访问键和值:

{{~ for var in variables ~}}
  {{ var[0] }}: {{ var[1] }} 
{{~ end ~}}

这种方式不需要修改C#代码,直接调整模板即可。

内容的提问来源于stack exchange,提问作者Standard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:55:03