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

Scriban访问列表对象属性返回空字符串问题排查

问题解决:Scriban无法访问自定义类属性的问题

问题核心并非Scriban不支持列表索引+属性访问的特性,也不是你的操作有误,而是Scriban对自定义.NET类的成员访问需要特定配置或对象处理方式。

解决方法

方法1:改用匿名类型(快速生效)

将自定义BomInfo实例替换为匿名类型,Scriban可直接识别匿名类型的属性:

var boms = new List<dynamic> { new { PartNumber = "1234-12345-12", Revision = "A" } };
var output = Scriban.Template.Parse("{{boms[0].Revision}}").Render(new { boms = boms });
Console.Out.WriteLine(output); // 输出A

方法2:配置模板上下文,允许反射访问自定义类属性

通过TemplateContext显式配置成员访问规则,确保Scriban能正确反射自定义类的公共属性:

var boms = new List<BomInfo> { new BomInfo { PartNumber = "1234-12345-12", Revision = "A" } };
var template = Scriban.Template.Parse("{{boms[0].Revision}}");

var context = new TemplateContext();
// 保留成员名称的大小写,避免自动转换导致匹配失败
context.MemberRenamer = member => member.Name;
// 启用宽松成员访问,允许反射读取公共属性
context.EnableRelaxedMemberAccess = true;
// 将数据模型推入上下文
context.Push(new { boms = boms });

var output = template.Render(context);
Console.Out.WriteLine(output); // 输出A

方法3:用ScriptObject包装自定义对象

使用Scriban原生的ScriptObject封装自定义对象,显式暴露需要访问的属性:

var bomScriptObj = new Scriban.Runtime.ScriptObject();
bomScriptObj.SetValue("PartNumber", "1234-12345-12", true);
bomScriptObj.SetValue("Revision", "A", true);

var boms = new List<Scriban.Runtime.ScriptObject> { bomScriptObj };
var output = Scriban.Template.Parse("{{boms[0].Revision}}").Render(new { boms = boms });
Console.Out.WriteLine(output); // 输出A

原因说明

Scriban对匿名类型、动态类型的属性支持更直接,而自定义.NET类的属性访问依赖反射机制。如果未配置正确的上下文策略,Scriban可能无法识别类的公共属性,从而输出空字符串。而{{boms[0]}}能输出有效结果,是因为Scriban会默认调用对象的ToString()方法,无需访问内部属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:53:22