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

