是否可以在文本模板中使用匿名类型

本文关键字:类型 文本 是否 | 更新日期: 2023-09-27 18:31:52

我正在编写一个文本模板,并有以下代码行:

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}
    };

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

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

是否可以在文本模板中使用匿名类型

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

这可能与你能得到的一样简洁。

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

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

然后使用后期绑定来访问属性。无论如何,T4模板都没有任何智能感。

这应该可以正常工作。 在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 模板的正文中起作用。 如果要查看我们正在编译的内容,请将模板代码粘贴到运行时(预处理)模板中,您将看到扩展作为其输出。