3

I am writing a text template and have the following line of code:

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

I would like to convert this to an array of anonymous types:

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

The text template, however, though it appears to be a single contiguous function, does not allow the use of implicitly typed local variables.

Is there a simple way to bypass this limitation and use anonymous types within a text template?

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 回答