3

T4 テンプレート ファイルの最後に、いくつかの関数が定義されています。

<#+
    type Foo(...) { ... }
    type Bar(...) { ... }
    ...
#>

それは正常に動作します。

現在、別のテンプレートを作成しています。最初のテンプレート ファイルで宣言された関数を使用する方法はありますか (おそらく 3 番目のファイルを使用してこれらの関数を格納することによって)?

4

3 に答える 3

4

include ディレクティブを使用して、別のファイルにあるコードを共有できます。

<#@ include file="Included.tt" #>
于 2013-10-22T16:46:00.090 に答える
2

マットの答えは100%正しいです...しかし、私は「モデル」を使用することを好み、時には別のアセンブリで、非常に単純なループを除いて、コード生成のロジックなしでテンプレートをビューのように使用できます。 (for、foreachs...など)。後の方が読みやすいと思います。メンテナンス、再利用、トラブルシューティング。モデルがプレーンな c# 、単純化された、テストされていない例で記述されているため

 <#@ output extension=".generated.cs" #>
 <#@ assembly name="$(SolutionDir)Bin\Net45\GeneratorModel.dll" #>
 <#@ import namespace="System.Collections.Generic" #>
 <#@ import namespace="GeneratorModel" #>
 <#@ import namespace="Extensions" #>
 <# IEnumerable<Type> entities = GetCollection();
    const string nameSpace = GetNameSpace();
  #> //Autogenerated Stuff
  using System;
  using System.Collections.Generic;
  namespace <#=nameSpace#> 
  {
    public interface IEntity{}

    <# foreach (var entity in entities){#>  

    #region class

    public partial class <#=entity.Name#> : IEntity {
        <#foreach(var prop in entity.GetPublicProperties()){#>
          /* More stuff Here .. */              
        <#}#>
    }

    #endregion class    
    <#}#>                                       
   }<#// End OF NameSpace #>
于 2013-10-23T05:51:23.997 に答える
1

最初の質問: 2012 と 2010 のどちらを使用していますか? 2010年はT4のインクルージョンガードがないという問題があります。これは、再利用可能な T4 ヘルパー メソッド ファイルを作成する場合、何度も何度も含めて、同じファイルを参照することでエラーが発生しないように注意する必要があることを意味します。些細なケースでは T4 で問題ありませんが、Sych の T4Toolbox などを使用して T4 で大きな構造を構築し始めると、問題が発生します。

<#@ include file="MyTools.Include.tt" #>

また、実際には 2 種類のテンプレートがあることを考慮する必要があります。直接生成されることを意図した「ルート」テンプレートと、含まれることを意図した「サポート」テンプレートです。これらを区別する規則を考え出すことをお勧めします。そのために「.Include.tt」ファイル名を使用しますが、他の人は独自のアプローチをとります。また、インクルード ファイルから「カスタム ツール」属性をクリアして、ガベージ テンプレートで時間を無駄にすることなく「すべて変換」コマンドを自由に使用できるようにすることもできます。

極端な場合、独自のアセンブリをコンパイルして T4 で使用することができます。これにより、再利用可能なものを動的にコンパイルするのを待つのではなく、高速な変換が可能になります...しかし、これには独自の問題があります。

于 2013-11-06T22:11:05.363 に答える