T4 テンプレート ファイルの最後に、いくつかの関数が定義されています。
<#+
type Foo(...) { ... }
type Bar(...) { ... }
...
#>
それは正常に動作します。
現在、別のテンプレートを作成しています。最初のテンプレート ファイルで宣言された関数を使用する方法はありますか (おそらく 3 番目のファイルを使用してこれらの関数を格納することによって)?
include ディレクティブを使用して、別のファイルにあるコードを共有できます。
<#@ include file="Included.tt" #>
マットの答えは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 #>
最初の質問: 2012 と 2010 のどちらを使用していますか? 2010年はT4のインクルージョンガードがないという問題があります。これは、再利用可能な T4 ヘルパー メソッド ファイルを作成する場合、何度も何度も含めて、同じファイルを参照することでエラーが発生しないように注意する必要があることを意味します。些細なケースでは T4 で問題ありませんが、Sych の T4Toolbox などを使用して T4 で大きな構造を構築し始めると、問題が発生します。
<#@ include file="MyTools.Include.tt" #>
また、実際には 2 種類のテンプレートがあることを考慮する必要があります。直接生成されることを意図した「ルート」テンプレートと、含まれることを意図した「サポート」テンプレートです。これらを区別する規則を考え出すことをお勧めします。そのために「.Include.tt」ファイル名を使用しますが、他の人は独自のアプローチをとります。また、インクルード ファイルから「カスタム ツール」属性をクリアして、ガベージ テンプレートで時間を無駄にすることなく「すべて変換」コマンドを自由に使用できるようにすることもできます。
極端な場合、独自のアセンブリをコンパイルして T4 で使用することができます。これにより、再利用可能なものを動的にコンパイルするのを待つのではなく、高速な変換が可能になります...しかし、これには独自の問題があります。