1

假设我有一个 T4 模板 TextTemplatingFilePreprocessor(生成一个生成输出的类):是否可以向生成器类添加一个属性(不在输出本身内)?基本上我想要这样的东西:

#line 1 "C:\Path\To\MyTemplate.tt"
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "11.0.0.0")]
[MyAttributeHere]
public partial class MyTemplate : MyTemplateBase
{
    // ...

我知道我可以使用该模板的另一个部分声明创建另一个文件,并在其上添加属性,但是如果可能的话,我想避免这种情况。

4

2 回答 2

1

如果您使用的是 VS 2012,则可以使用简单的自定义指令处理器来实现。使用Visual Studio SDK为 Visual Studio 创建一个简单的 MEF 组件扩展(使用类似于编辑器着色器模板的东西)。删除模板提供的代码并将其替换为一个简单的类,该类提供IDirectiveProcessor接口的大部分无操作实现Microsoft.VisualStudio.TextTemplating.Interfaces.11.0.dll

GetTemplateClassCustomAttributes在该接口的方法的实现中发出您的属性。

[DirectiveProcessor]最后,用同一个程序集中的和属性装饰您的类[SuppportedDirective],以便 T4 选择新的指令处理器。

构建时,您应该获得一个 VSIX,您可以轻松地将其部署到您需要在生成时支持此新指令的任何机器上。将新指令放在模板的顶部,您的属性将被添加到您的预处理类中。就像是:

<#@ MyCustomAttr processor="MyCode.CustomAttrProvider" #>

于 2013-05-28T20:17:02.520 回答
1

我认为您必须提供自己的自定义工具来替换TextTemplatingFilePreprocessor.

自定义工具属性

我想你会继承Microsoft.VisualStudio.TextTemplating.VSHost.TemplatedPreprocessor和覆盖ProcessTemplate().

于 2013-05-24T14:19:14.007 回答