如何通过代码获取T4模板输出文件的完整名称
T4模板获取输出扩展名的解决方案
这里直接给两种可落地的方案:
方案1:硬关联定义(最简单推荐)
直接在模板内同步定义输出扩展名,同时用于output指令和业务逻辑,完全不需要调用额外API:
<#@ output extension=".cs" #> <# // 同步定义和output指令一致的扩展名 const string OutputExtension = ".cs"; // 拼接生成的完整文件名 string outputFileName = Path.ChangeExtension(Path.GetFileName(Host.TemplateFile), OutputExtension); #>
这个方案的优势是逻辑简单无依赖,改扩展名的时候只要同步改两处就行,适合绝大多数场景。
方案2:动态解析模板的output指令(无重复定义)
如果不想重复维护扩展名,可以直接读取当前T4模板文件的内容,用正则匹配提取output指令里的扩展名:
<#@ import namespace="System.IO" #> <#@ import namespace="System.Text.RegularExpressions" #> <# // 读取当前模板文件的所有内容 string templateContent = File.ReadAllText(Host.TemplateFile); // 正则匹配output指令的extension属性 Match extMatch = Regex.Match(templateContent, @"<#@\s*output.*extension\s*=\s*""(?<ext>[^""]+)""", RegexOptions.IgnoreCase); string outputExtension = extMatch.Success ? extMatch.Groups["ext"].Value : ".cs"; // 拼接完整文件名 string outputFileName = Path.ChangeExtension(Path.GetFileName(Host.TemplateFile), outputExtension); #>
这个方案可以做到只修改output指令一处就同步生效,适合模板需要频繁切换输出扩展名的场景。
补充说明
如果你的模板运行环境支持访问VS的DTE对象,也可以通过DTE接口获取当前TT文件对应生成项的文件名,不过需要额外引用EnvDTE程序集,复杂度更高,一般前两种方案就可以覆盖99%的使用场景。
内容的提问来源于stack exchange,提问作者ackh
相关产品推荐
相关产品推荐

