0

テンプレートが存在するアセンブリとは別のアセンブリで、T4 テンプレートで使用する基本クラスを作成しました。基本クラスでは、Host プロパティにアクセスする必要があります。このプロパティは、生成されたクラスに追加されます。そのため、基本クラスでコンパイル エラーが発生しないように、抽象プロパティを追加しました。

public virtual global::Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost Host { get; set; }

ビルドの警告が表示されます:

「Microsoft.VisualStudio.TextTemplatingD0A29F1F828173770AF28F0494709F7D.GeneratedTextTransformation.Host」は、継承されたメンバー「MyProject.TextTransformationBase.Host」を非表示にします。現在のメンバーでその実装をオーバーライドするには、override キーワードを追加します。それ以外の場合は、新しいキーワードを追加してください。

実行時エラーが発生します:

エラー 2 実行中の変換: System.Exception: ホスト プロパティが予期しない値 (null) を返しました

VS2012 では、テンプレート ディレクティブに hostSpecific="trueFromBase" 属性が追加されたようです。これにより、この特定のユース ケースが解決されると想定しています。VS2010に回避策があるかどうか疑問に思っていました。

おそらく、基本クラスで別のプライベート プロパティ名を使用し、実行時にリフレクションを使用して Host プロパティにアクセスすることで、これを回避することができます。もっと良い方法がないか見たかっただけです。

4

1 に答える 1

0

これは機能します。

private ITextTemplatingEngineHost _host;
private ITextTemplatingEngineHost HostProperty {
    get
    {
        if (_host == null)
        {
            _host = (ITextTemplatingEngineHost)this.GetType().GetProperty("Host").GetValue(this, null);
        }
        return _host;
    }            
}
于 2013-06-14T13:45:44.607 に答える