0

Visual Studio 2010 TextTemplatingFileGeneratorカスタムツールを使用してC#コード(.cs)を生成していますが、特定のプログラム条件で特定の.ttが完全に生成されないようにする方法があるかどうかを知りたいです。

私は次のことを達成したい:

  • 通常の編集可能なクラスを生成したい場合があります。
  • また、親子関係を表すクラスのペアを生成したい場合もあります。各クラスは、役割に必要な特定のルールセットを実装します。

答える前に、TextTemplatingFilePreprocessorを使用するつもりはないことを覚えておいてください-私はすでにその長所と短所を調査しました。他のシナリオには適していますが、私の現在の状況には適していません。だから私は本当にTextTemplatingFileGeneratorに固執したいです。

4

3 に答える 3

1

A、B、Cのすべてに対して生成される最小のスタブファイル(または常に最小のスタブを生成する1つの「制御」ファイル)で生活できる場合は、DamienGuardの複数ファイル出力などを使用してT4で直接これを行うことができます技術。

http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited

これは、テンプレートからプログラムで制御できます。

于 2012-08-10T19:49:07.703 に答える
1

何度も掘り下げた後、解決策は常に目の前にあったことに気付きました。構成が動的なマルチパートクラスが必要でした。結果がサブセットに基づく場合もあれば、別のサブセットに基づく場合もあります。

だから、ここに行きます

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#

    var IsParent = true; // setting to false prevents Parent code from being generated
    var IsChild = true; // setting to false prevents Child code from being generated

    GenHeader();

    if (IsParent)
        GenParentProperties();

    if (IsChild)
        GenChildProperties();

    GenFooter();

#>

<#+
    void GenHeader()
    {
#>
// Code generated by a template

using System;

namespace StackOverflow
{
    public class Person
    {
        string Name;
        int Age;
<#+
    }
#>


<#+
    void GenParentProperties()
    {
#>
        Person[] Childs;
<#+
    }
#>

<#+
    void GenChildProperties()
    {
#>
        Person Father;
        Person Mother;
<#+
    }
#>

<#+
    void GenFooter()
    {
#>
    }
}
<#+
    }
#>

それが他の誰かに役立つことを願っています。乾杯!

于 2012-08-12T03:05:56.137 に答える
1

ここにあるシナリオは 100% ではありませんが、生成されたコードの一部を編集し、再生成時に変更を保持できるようにするコードを生成したいようです。これがあなたが探しているものでない場合は、この投稿を無視できます (ただし、その場合は、シナリオの詳細な説明を提供してください)。

上記のシナリオは、T4 では不可能です。ただし、C# コードを生成する場合は、partial キーワードを使用して、コードの一部を生成し、他の部分を手書きすることができます。

クラス A を生成するとします。T4 テンプレートは、生成されたクラスに部分属性を適用する必要があります。

// This class is auto-generated
partial class A 
{ 
     int X; 
}

これにより、生成されたクラスを、手動で維持する別のファイルの新しいメンバーで拡張できます。

// This class is manually written
partial class A 
{
    int Y; 
}

最終的なクラス A には、フィールド X と Y が含まれます。

部分メソッドを使用してクラス A の動作を変更することもできます

お役に立てれば

于 2012-08-10T13:49:20.427 に答える