2016-12-20 17 views
0

T4テンプレートでクラスを作成しようとしています。これは、エラーを与える:T4 templates:名前空間のエラー

Compiling transofrmation: Type of namespace definition, or end-of-file expected 

私は次のコードがある場合:

<#+ 
namespace Learn { 
    public class Converter 
    { 

    } 
} 
#> 

をしかし、それは私が名前空間

<#+ 
    public class Converter 
    { 

    } 
#> 

を削除する場合T4にはない、なぜ私の質問は、ある正常に動作しますnamespaceを認識しますか?

+1

'<# #>'のコードは生成されているコードではなく、コードを生成するために実行されているコードなので、 – Pawel

答えて

2

<#+#>はクラスフィーチャブロックです。このブロックの中に入れたものは、クラスステートメントの内部に書き込まれます。あなたはT4が生成し、このような何かコンパイルしようとした名前空間を追加する場合:

class MyT4TempGen { 

    public string run() { 
      inside here is code that uses a string builder to build up all your <# #> tags into one big statement 
    } 

    from here down all your <#+ #> tags are added 

    namespace Learn { 
     public class Converter { 

     } 
    } 

} 

これは、有効なC#コードではありませんが、名前空間は、クラス文の中に存在することはできません。あなたは、名前空間なしでそれを行うときは、これを取得します:#コードC有効です

class MyT4TempGen { 

    public string run() { 
     inside here is code that uses a string builder to build up all your <# #> tags into one big statement 
    } 

    from here down all your <#+ #> tags are added   

    public class Converter { 

    } 

} 

は、あなたのクラスは、T4コンパイラが作成する1のサブクラスになります。

ここには、サポートされるタグを説明するmsdn docsへのリンクがあります。 「クラス機能制御ブロック」のセクションを参照してください。 ttまたはt4ファイルに入力したものは解析され、.netコードに変換されるので、すべての通常の構文規則に従わなければならないことを覚えておいてください。

+0

フランクの詳細な説明をお寄せいただきありがとうございます。 – akshayKhot