T4 编辑生成的代码作为其生成

Posted

技术标签:

【中文标题】T4 编辑生成的代码作为其生成【英文标题】:T4 editing the generated code as its generated 【发布时间】:2016-09-06 21:12:36 【问题描述】:

我有一个使用 T4 模板生成嵌入式 C 代码的 c# 应用程序。 但是我对结果输出有一个小问题,我想知道是否有一个优雅的解决方案。

问题是我使用以下 T4 模板循环 for 循环和 foreach 以创建枚举和其他表:

typedef enum eSDef_Index

<#    for (int i = 0; i < ScreenDefinitions.Count(); i++)
       #>
    SD_IDX_<#=ScreenDefinitions[i].Name.ToUpper() #> = <#=i#>,
<#    
      // >>>> Can we do a backspace here?
#>
eSDEF_INDEX;

这成功地创建了我想要的枚举。但是,我使用的 C 编译器不喜欢最后一个枚举条目有逗号。我可以通过检查这是否是列表中的最后一项来解决这个问题,但是我想知道是否有更优雅的方式?

我的想法是在最后一个逗号生成后使用退格键有效地删除它。

那么是否可以添加直接影响生成代码的特殊字符?或任何其他方式?

【问题讨论】:

我发现了更多信息,即您可以使用 PushIndex("\t") 插入选项卡。因此,人们会假设(?)您可以执行 PushIndex("\b") 来执行退格操作,但实际上在此处放置了一个字符持有人,因此不会像我预期的那样做:( 您使用的是什么编译器(不符合标准)。 @Luca 它是一个非常古老的 ST Cosmic 编译器。 【参考方案1】:

我认为这是不可能的。

为什么不使用string.Join 方法?

typedef enum eSDef_Index

    <#= string.Join(",\r\n    ",
            ScreenDefinitions.Select((x, i) =>
                $"SD_IDX_x.Name.ToUpper() = i")
    ) #>
eSDEF_INDEX;

将注释放入第一个参数(分隔符):

    <#= string.Join(", // Comment \r\n    ",
            ScreenDefinitions.Select((x, i) =>
                "SD_IDX_" + x.Name.ToUpper() + " = " + i)
    ) #>

【讨论】:

非常感谢,我以前从未使用过 Join 或 Select 方法。我确实必须进行更改才能正确生成:"SD_IDX_" + x.Name.ToUpper() + " = " + i)。也许用这个更正来编辑你的帖子给其他人。谢谢。 我还有一个枚举,每个枚举后面都有 cmets,供参考。这意味着逗号在字符串的中间。我怎么能管理这个?所以使用我的第一个帖子示例:SD_IDX_&lt;#=ScreenDefinitions[i].Name.ToUpper() #&gt; = &lt;#=i#&gt;, // Comment @TheGrovesy - 查看更新。 $"..." - 是在 C#6 中出现的内插字符串。

以上是关于T4 编辑生成的代码作为其生成的主要内容,如果未能解决你的问题,请参考以下文章

编辑器STM32CubeMx生成的代码改为4空格制表符缩进

编辑器STM32CubeMx生成的代码改为4空格制表符缩进

T4语法快速入门

使用 t4 模板生成动态代码

在.Net Core中使用T4工具生成实体文件

无需任何配置即可生成实体代码的 T4 模板