【问题标题】:Can anonymous types be used in text templates?可以在文本模板中使用匿名类型吗?
【发布时间】:2012-04-20 18:33:52
【问题描述】:

我正在写一个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}
    };

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

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

【问题讨论】:

  • 这应该可以正常工作,在 Visual Studio 2010 中,我将您的 anonArray 代码直接粘贴到模板中,然后使用 foreach 遍历数组,一切都很好,正如我所料。你用的是什么版本的VS?
  • @GarethJ Visual Studio 2010。您使用的是文本模板吗? .tt?
  • 是的。具体来说,我使用的是 2010 SP1,但没关系。 Hello of type
  • @GarethJ 我不明白。我发誓var 以前没有工作过。我需要更努力地研究一下..
  • 我们只是用一些样板扩展模板,然后通过 CodeDOM 在它上面运行 C# 编译器,所以一般来说,在 C# 中工作的内容在 T4 中工作。如果您想查看我们正在编译的内容,请将您的模板代码粘贴到运行时(预处理)模板中,您将看到扩展。

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


【解决方案1】:
Dictionary<string, int> set = 
  {
      { "apple", 4 },
      { "grape", 1 }
  }

这可能是你能做到的最简洁的了。

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

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

然后使用后期绑定来访问您的属性。反正 T4 模板也不具备任何智能感知功能。

【讨论】:

  • 我正在寻找使用匿名类型的方法。给出的代码只是我希望如何清理我自己的代码的一个例子,它有更多的属性。
  • 匿名对象是否以编程方式创建?如果是这样,您可以使用 LINQ 将 Select 元素放入 IEnumerable
  • 您应该寻求解决问题,而不是使用某些特定的技术工具,除非您在这里的全部目的只是了解一些特定的技术工具。如果后者是正确的,那么这不是使用匿名类的合适地方,所以你应该找到一个更好的例子来练习。这个答案解决了根本问题。
  • @Servy 为什么这里不适合使用匿名类?
  • array[0].Name - 属性值在运行时使用dynamic 类型确定。考虑dynamic 在这种情况下就像object 一样,除了你可以调用不一定存在的属性/方法。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多