13

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; }
}

私の 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();

しかし、私はこのエラーメッセージを持っています:

コンパイル変換: 型または名前空間名 'ClassDefinition' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

私はインターネットでチェックして、しようとしました: - インクルードを使用 - アセンブリを使用 - USING を使用 しかし、何も機能しません。

何か案は ?

4

5 に答える 5

8

私の理解が正しければ、テンプレート生成の一部としてクラスを再利用しようとしています。

そのクラスは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 TemplateManager
{

次に、私が使用する他の t4 テンプレートで:

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

その後

List<Values> values = TemplateManager.PrepareVariables(code, container, itemCollection.OfType<EntityType>())

あなたの場合、その 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; }
}
#>

次に、含めることができます

<#@ include file="ClassDefinition.tt"#>
于 2014-07-28T08:14:00.023 に答える
1

以下を使用して、C# ファイルを T4 テンプレートに含めます。

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

T4 テンプレートの出力にテキストを追加します。クラスをコンパイルしません。

T4 テンプレートに debug=true が設定されているので、%TEMP% ディレクトリを見れば T4 が何を生成しているかがわかります。T4 テンプレートを実行すると、TEMP ディレクトリに生成された .cs ファイルが表示されます。このファイルには、次のようなものがあります。

 this.Write("public class ClassDefinition\r\n{\r\n    public string NameSpace { get; set; }\r\n    p" +
       "ublic string Name { get; set; }\r\n    public string Protection { get; set; }\r\n\r\n " +
       "  List<ClassProperty> Properties { get; set; }\r\n}");

したがって、C# クラスに起こっていることは、生成された T4 出力に書き出されることだけです。

おそらくやりたいことは、ClassDefinition.cs ファイルをプロジェクトに含めて、プロジェクトの一部としてコンパイルされるようにすることです。その後、ClassDefinition クラスを含むアセンブリを参照できます。したがって、プロジェクトの出力が MyLibrary.dll であり、コンパイルされた ClassDefinition.cs が含まれている場合は、次を使用できるはずです。

<#@ assembly name="$(SolutionDir)$(OutDir)MyLibrary.dll" #>

ClassDefinition.cs ファイルを含む行を削除する必要があります。

于 2014-07-26T09:39:20.453 に答える
-1

import ステートメントが機能するはずの後にこれを追加します。

<#
ClassDefinition cd = new ClassDefinition();
#>
于 2016-10-28T10:35:38.287 に答える