3

テキスト テンプレートを作成しており、次のコード行があります。

Tuple<string, int, bool>[] tupleArray = new[]
    {
        new Tuple<string, int, bool>("apple", 4, true),
        new Tuple<string, int, bool>("grape", 1, false)
    };

これを匿名型の配列に変換したいと思います:

var anonArray = new[]
    {
        new {Name = "apple", Diam = 4, Tasty = true},
        new {Name = "grape", Diam = 1, Tasty = false}
    };

ただし、テキスト テンプレートは、単一の連続した関数のように見えますが、暗黙的に型指定されたローカル変数の使用を許可していません。

この制限を回避し、テキスト テンプレート内で匿名型を使用する簡単な方法はありますか?

4

2 に答える 2

3
Dictionary<string, int> set = 
  {
      { "apple", 4 },
      { "grape", 1 }
  }

それはおそらくあなたが得ることができるのと同じくらい簡潔です。

編集:本当に匿名オブジェクトを使用する機能が必要な場合は、いつでもパンとバターのdynamic配列を使用できます。

dynamic[] array = new dynamic[] { new { Name = "Apple", Diam = 4 }, ... }

次に、遅延バインディングを使用してプロパティにアクセスします。とにかく、T4テンプレートにインテリセンスがあるわけではありません。

于 2012-04-20T18:37:41.870 に答える
1

これで問題なく動作するはずです。Visual Studio 2010 では、anonArray コードをテンプレートに直接貼り付けてから、foreach を使用して配列をループ処理しましたが、予想どおり、すべてうまくいきました。これがテンプレートとしてのコードです。


<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>
<#
    var anonArray = new[] {
        new {Name = "apple", Diam = 4, Tasty = true},
        new {Name = "grape", Diam = 1, Tasty = false},
    };
#>
<# foreach ( var foo in anonArray) { #>
Hello <#= foo.Name #> of type <#= foo.GetType() #>
<# } #> 

T4 は定型文を使用してテンプレートを展開し、CodeDOM を介して C# コンパイラを実行するだけなので、一般に、C# のメソッド内で機能するものは T4 テンプレートの本体で機能します。コンパイルされているものを確認したい場合は、テンプレート コードをランタイム (前処理済み) テンプレートに貼り付けると、その出力として展開が表示されます。

于 2012-04-21T02:04:17.367 に答える