T4 - TT - 在TT文件中使用自定义类

Eag*_*gle 9 css c# t4 texttemplate

我想在我的TT中的CS文件中使用我自己的类定义.

例:

public class ClassDefinition
{
    public string NameSpace { get; set; }
    public string Name { get; set; }
    public string Protection { get; set; }

    List<ClassProperty> Properties { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的TT看起来像:

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>

<#@ assembly name="System" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml"#>

<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>

<#@ include file="$(ProjectDir)ClassDefinition.cs" #>

<#

// Read the model file
XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(this.Host.ResolvePath("GeneratedXmlFile.xml"));

IList<XmlNode> nodeList = new List<XmlNode>();
foreach (XmlNode node in doc.DocumentElement)
{
    switch(node.Name)
    {
        case "Model": 
        {
            ClassDefinition classDefinition = new ClassDefinition();
Run Code Online (Sandbox Code Playgroud)

但是我有这个错误消息:

编译转换:找不到类型或命名空间名称"ClassDefinition"(您是否缺少using指令或程序集引用?)

我在互联网上检查并试图: - 使用包括 - 使用汇编 - 使用USING但没有任何作用.

有任何想法吗 ?

Eag*_*gle 14

这是完整的解决方案:

1)将类分成另一个项目2)通过TT via包括对这些类的引用

<#@ assembly name="$(TargetDir)MyOwnLibraryProject.dll" #>
<#@ import namespace="MyOwnNamespace" #>
Run Code Online (Sandbox Code Playgroud)

3)不要忘记在TT项目中包含此库的参考

4)您必须将MyOwnLibraryProject.dll复制到TT解决方案的BIN\DEBUG文件夹中

5)神奇的出现!

每次更改DLL时都不要忘记将新版本放入文件夹中:)或者只是将Library项目输出配置为与TT版本相同.我想感谢大家提供指导和想法.


rec*_*ace 5

如果我对您的理解正确,那么您正在尝试重用一个类,作为模板生成的一部分。

该类本身必须位于tt文件中,构建操作设置为none,自定义工具-否。我所拥有的是模板管理器类,其顶部为以下内容:

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Diagnostics" #>

<#+
public class TemplateManager
{
Run Code Online (Sandbox Code Playgroud)

然后在其他t4模板中使用:

<#@ include file="TemplateManager.tt"#>
Run Code Online (Sandbox Code Playgroud)

然后

List<Values> values = TemplateManager.PrepareVariables(code, container, itemCollection.OfType<EntityType>())
Run Code Online (Sandbox Code Playgroud)

在您的情况下,ClassDefinition.tt文件将包含:

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Diagnostics" #>

<#+
public class ClassDefinition
{
    public string NameSpace { get; set; }
    public string Name { get; set; }
    public string Protection { get; set; }

    List<ClassProperty> Properties { get; set; }
}
#>
Run Code Online (Sandbox Code Playgroud)

然后,您可以包括

<#@ include file="ClassDefinition.tt"#>
Run Code Online (Sandbox Code Playgroud)