可以在文本模板中使用匿名类型吗?

时间:2012-04-20 18:33:53

标签: c# t4 anonymous-types implicit-typing

我正在撰写text template并拥有以下代码行:

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

我想将其转换为anonymous types的数组:

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

然而,文本模板虽然看似是单个连续函数,但不允许使用隐式类型的局部变量。

是否有一种简单的方法可以绕过此限制并在文本模板中使用匿名类型?

2 个答案:

答案 0 :(得分:3)

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

这可能就像你能得到的那样简洁。

编辑:如果你真的想要使用匿名对象,你可以随时使用面包和黄油dynamic数组:

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

然后使用后期绑定来访问您的属性。它不像T4模板有任何intellisense反正。

答案 1 :(得分: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模板的主体中工作。如果您想查看我们正在编译的内容,请将模板代码粘贴到运行时(预处理)模板中,您将看到扩展作为其输出。

相关问题