T4”;头部防护装置”;对于包含的文件
本文关键字:于包含 文件 头部 T4 装置 | 更新日期: 2023-09-27 17:57:38
我正在尝试为代码生成编写一些漂亮且结构化的t4。我将逻辑分解为可重用的函数,并将它们放入单独的文件中(就像"正常"代码一样)。问题是我不能包含一个通用文件,因为它将被包含多次。
例如,我有4个文件:Core.tt
、File1.tt
、File2.tt
和MainTemplate.tt
。CCD_ 5包含在CCD_ 6和CCD_。而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
是的,此功能内置于T4系统中。
T4"include"指令支持"once"属性,该属性应确保模板只包含一次,以防止重复。
示例:
<#@ include file="filePath.tt" once="true" #>
不幸的是,我还没能找到一种方法来实现这一点,因为在C#中使用#define的地方有很大的限制,而且#include在代码中出现得太晚了。
在这一点上,您最好的选择是在上记录功能请求http://visualstudio.uservoice.com试着争取一些支持。
就我个人而言,我很想把这个功能融入到产品中。
我遇到了类似的问题,出现了以下错误消息:
Compiling transformation: The type 'GeneratedTextTransformation' already contains a definition for 'BaseCodegenTemplate'
我用CTRL+SHIFT+F 并且在2个不同的文件中发现了该行的2次出现。在我从其中一个文件中删除其中一个事件后,错误消失了。 但是,由于该文件中现在缺少BaseCodegenTemplate.tt文件的include语句,因此该文件中的某些代码将用红色突出显示,因为缺少BaseCodegenTemplate.tt中包含的类型定义。但总体代码编译得很好:在构建过程中包括了BaseCodegenTemplate.tt中定义的类型,因为在另一个文件中引用了BaseCodegenTemplate.tt。<#@ include file="BaseCodegenTemplate.tt" #>