首页 > 解决方案 > 如何将多个参数传递给StringTemplate4上的子模板

问题描述

我正在尝试调用一个子模板,在该子模板中我需要将两个表达式作为参数传递并使用 CustomRenderer 处理这些参数。

当使用一个参数调用子模板 + CustomRenderer 时,它是通过从模板上下文调用方法来完成的,如下代码所示。

我的问题是:例如,我该如何打电话

$concat2values(context.Value, "Literal")$

给定的 context.Value 是一个字符串“somevalue”,因此接收

somevalueLiteral

obs。:我担心的是CustomRenderer 只是reveice 一个对象参数,我没有尝试以这种方式构建模板。我的目标是在处理它的“引擎”上从脚本中拦截一些处理过的代码。

模板组.stg

group mygroup;

delimiters "$","$"

main(context) ::= <<
$formatSomething(context.Value)$
>>

formatSomething(value) ::= <<
$value; format = "_formatSomething_"$
>>

我的格式化程序

using Antlr4.StringTemplate;
using System;
using System.Globalization;
using System.Linq;

namespace Engine.Components.Engine.Formatters
{
    public class SomeFormatter: StringRenderer
    {
        public override string ToString(object o, string formatString, CultureInfo culture)
        {
            if ("_formatSomething_".Equals(formatString))
                return FormatSomething(o);
            return base.ToString(o, formatString, culture);
        }

        private string FormatSomething(object o)
        {
            ** DO STUFF **
            string result = do_stuff_and_return_it_formatted();
            return result;
        }
    }
}

我的模板引擎.cs

private string ProcessTemplate<T>(string fullPathTemplateFileName, T context)
{
    try
    {
        var templateSource = File.ReadAllText(fullPathTemplateFileName);
        var groupTemplate = CreateTemplateGroup(templateSource);

        var templates = new TemplateGroupString(groupTemplate);
        // vvvvvvv----- SHOULD I USE OBJECT OR ANOTHER SPECIFIC TYPE TO THE TASK?
        templates.RegisterRenderer(typeof(object), new SomeFormatter());      
        var engine = templates.GetInstanceOf("main");

        if (engine == null)
            throw new Exception($"Failed to get template {fullPathTemplateFileName}");

        engine.Add("context", context);

        return engine.Render();
    }
    catch (Exception ex)
    {
        Errors.Add($"{ex.Message}{ex.StackTrace}");
        return $"{ex.Message}{ex.StackTrace}";
    }
}

标签: c#stringtemplate-4antrl4

解决方案


推荐阅读