是否可基于现有类自动生成T4模板(.tt)文件?
可行性结论
完全可以基于已编写完成的C#类自动生成带自定义变量的T4模板,不需要从零手写模板内容,即使是结构复杂的类也能通过自动化工具完成模板生成,效率远高于手动编写。
具体实现步骤
- 标记可变点位
先梳理现有类中所有需要动态替换的内容(比如示例中的类名后缀A、常量字符串中的A),如果可变点位规则统一,可以直接用正则批量匹配替换为临时占位符;如果类结构复杂、可变点位分散且规则不统一,直接用Roslyn解析C#语法树,精准定位类名、构造函数名、常量值、属性名等需要参数化的语法节点,避免正则误替换注释、无关字符串中的同名内容。
以你给出的示例类为例,替换临时占位符后的内容如下:
public class Class{{ClassNameSuffix}} { private const string MyField = "Test-{{ClassNameSuffix}}"; public Class{{ClassNameSuffix}}() { } }
- 自动生成T4模板基础结构
写一个极简的转换工具,自动完成以下逻辑,不需要手动编辑模板框架:- 读取替换完占位符的类内容
- 自动拼接T4模板的标准头部声明,包括模板语言配置、输出文件格式配置、自定义参数声明
- 将所有临时占位符替换为T4的参数输出标记
<#= 参数名 #>
生成的基础T4模板内容如下:
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".cs" #> <#@ parameter name="ClassNameSuffix" type="System.String" #> public class Class<#= ClassNameSuffix #> { private const string MyField = "Test-<#= ClassNameSuffix #>"; public Class<#= ClassNameSuffix #>() { } }
后续只需要给ClassNameSuffix参数传入不同的值(B/C/D等),就能自动生成对应的ClassB、ClassC、ClassD类。
- 批量生成适配
如果需要一次性生成多个变体类,不需要逐个传参执行模板,直接在T4模板中加入循环逻辑,传入待生成的标识列表即可批量输出,示例如下:
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".cs" #> <# // 可自行修改需要生成的类标识列表 var classIdentifiers = new [] {"B", "C", "D"}; #> <# foreach(var id in classIdentifiers) { #> public class Class<#= id #> { private const string MyField = "Test-<#= id #>"; public Class<#= id #>() { } } <# } #>
高复杂度类适配提示
对于结构复杂的业务类,不要用纯正则做替换,优先用Roslyn做语法树解析:你可以自定义解析规则,比如只替换public类名、特定前缀的常量、标记了自定义特性的属性,自动跳过不需要修改的逻辑代码、注释、私有方法等内容,生成模板的准确率能达到100%,后续类逻辑更新后只需要重新跑一次转换工具就能同步更新T4模板,完全不需要手动维护模板内容。
内容的提问来源于stack exchange,提问作者Odrai
相关产品推荐
相关产品推荐

