包含文件的T4“标题保护”

时间:2013-02-05 13:33:09

标签: c# visual-studio code-generation t4

我正在尝试为代码生成编写一些漂亮且结构化的t4。我将我的逻辑分解为可重用的函数,并将它们放入单独的文件中(就像“普通”代码一样)。问题是我不能包含一个公共文件,因为它将被多次包含。

例如,我有4个文件:Core.ttFile1.ttFile2.ttMainTemplate.ttCore.ttFile1.tt都包含File2.ttFile1.tt

中包含File2.ttMainTemplate.tt

当我想从MainTemplate.tt生成输出时,我收到以下错误:

Error   8   Compiling transformation: The type 'Microsoft.VisualStudio.TextTemplating62CD98C8FF0EB737CAFBD5ED17A158C3.GeneratedTextTransformation' already contains a definition for 'PropertyAttribute'

我猜,原因是Core.tt已被包含两次。我的问题有解决方法吗?在c ++中可以添加标题保护:#ifndef xxx #define xxx #endif

3 个答案:

答案 0 :(得分:2)

是的,此功能内置于T4系统。

The T4 'include' directive supports a 'once' attribute,应确保模板仅包含一次,以防止重复。

示例:

<#@ include file="filePath.tt" once="true" #>

答案 1 :(得分:1)

不幸的是,我无法找到一种方法来实现这一点,因为在C#中使用#define的地方存在严格的限制,并且#include在代码中来得太晚了。 / p>

此时您最好的选择是在http://visualstudio.uservoice.com上记录功能请求并尝试提供支持。

就个人而言,我很乐意将此功能纳入产品中。

答案 2 :(得分:0)

我遇到类似问题,出现以下错误消息:

Compiling transformation: The type 'GeneratedTextTransformation' already contains a definition for 'BaseCodegenTemplate'

我用 CTRL + SHIFT + F 为这一行文本搜索了我的项目:

<#@ include file="BaseCodegenTemplate.tt" #>

并在2个不同的文件中发现了这一行的2次出现。从其中一个文件中删除其中一个出现后,错误消失了。

但是因为该文件中缺少BaseCodegenTemplate.tt文件的include语句,所以该文件中的某些代码以红色突出显示,因为缺少BaseCodegenTemplate.tt中包含的类型定义。但整体代码编译得很好:在构建过程中包含BaseCodegenTemplate.tt中定义的类型,因为BaseCodegenTemplate.tt在另一个文件中被引用。