2012-04-29 9 views
5

<#+#>括弧で宣言された非静的メソッドからホストオブジェクトにアクセスしようとすると、すべて正常に機能します。しかし、私はこのように、クラスメソッドからアクセスする必要があります。T4クラスからホストオブジェクトにアクセス

<#+ 
public class ProjectTraverser 
{ 
    public void Traverse() 
    { 
     var a = Host; 
    } 
} 
#> 

このテンプレートが実行されたとき、私は次のエラーを取得する:を「変革のコンパイル:「アウタータイプの非静的メンバにアクセスすることはできませんMicrosoft.VisualStudio Microsoft.VisualStudio.TextTemplating7D03DF372FEAC3D3A28C011A41F02403.GeneratedTextTransformation.ProjectTraverser 'D「のネストされたタイプ' を介して.TextTemplating7D03DF372FEAC3D3A28C011A41F02403.GeneratedTextTransformation:プロジェクト\ \テストソリューション\たGettingStarted \ TelerikMvc3RazorApplication \ TextTemplate2.tt」

は、任意のアイデアを共有してください。

+1

それはそれは言うまったく同じである(アウタータイプの非静的メンバにアクセスすることはできません)しかし、あなたはProjectTraverserにコンストラクタでホストを渡すことができます。 – FuleSnabel

+0

あなたのコメントFuleSnabelに感謝します。カプセル化の最高レベルではありませんが、解決策です。 – Narek

答えて

4

FuleSnabelがコメントしたように、作成している宣言は、テンプレートを表す囲みタイプのインスタンス変数にアクセスできないネストされた型用です。

あなたがしたいことは、ITextTemplatingEngineHostタイプのホストプロパティをProjectTraverserクラス(おそらく静的)に追加し、それをメインテンプレートから設定することです。

振り返ってみると、同じAppDomain内の同じテンプレートの異なるインスタンスに対して複数のホストを想像するのは賢明ではないので、メインのHostプロパティを静的にしたいと思っています。ここで

はラフな例です:

<#@ template hostspecific="true' #> 
<# 
    ProjectTraverser.Host = Host; 
#> 
<#+ 
public class ProjectTraverser 
{ 
    public static ITextTemplatingEngineHost Host { get; set; } 

    public void Traverse() 
    { 
     var a = Host; 
    } 
} 
#> 
+0

答えてくれてありがとうGareth、 "あなたは"メインテンプレートからそれを設定してください。私が理解する限り、私は自分のクラスのための別の初期化メソッドを持っていなければなりません。クラスを使う前に呼び出さなければなりません。かなり不便です。私は正しいのですか、これはもっと良い方法で達成できますか? – Narek

+0

小さな例を含むように編集されました。 – GarethJ

関連する問題