我正在尝试为代码生成编写一些漂亮且结构化的t4。我将我的逻辑分解为可重用的函数,并将它们放入单独的文件中(就像“普通”代码一样)。问题是我不能包含一个公共文件,因为它将被多次包含。
例如,我有4个文件:Core.tt
,File1.tt
,File2.tt
和MainTemplate.tt
。
Core.tt
和File1.tt
都包含File2.tt
。
File1.tt
File2.tt
和MainTemplate.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
答案 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在另一个文件中被引用。