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
相关产品推荐
相关产品推荐

