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

C# 可以在文本模板中使用匿名类型吗?,c#,t4,anonymous-types,implicit-typing,C#,T4,Anonymous Types,Implicit Typing,我正在写一篇文章,代码如下: Tuple<string, int, bool>[] tupleArray = new[] { new Tuple<string, int, bool>("apple", 4, true), new Tuple<string, int, bool>("grape", 1, false) }; 然而,文本模板虽然看起来是一个单独的连续函数,但不允许使用隐式类型的局部变量 有没有一种简

我正在写一篇文章,代码如下:

Tuple<string, int, bool>[] tupleArray = new[]
    {
        new Tuple<string, int, bool>("apple", 4, true),
        new Tuple<string, int, bool>("grape", 1, false)
    };
然而,文本模板虽然看起来是一个单独的连续函数,但不允许使用隐式类型的局部变量

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

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

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

这应该很好用。在VisualStudio2010中,我将anonArray代码直接粘贴到模板中,然后使用foreach在数组上循环,一切都很好,正如我所期望的那样。以下是作为模板的代码



你好,类型


T4只是用一些样板文件扩展模板,然后通过CodeDOM在模板上运行C#编译器,所以一般来说,在C#中的方法中起作用的是T4模板的主体。如果您想查看我们正在编译的内容,请将模板代码粘贴到运行时(预处理)模板中,您将看到扩展作为其输出。

我正在寻找使用匿名类型的方法。给出的代码只是一个示例,说明了我如何清理自己的代码,其中包含更多属性。匿名对象是通过编程方式创建的吗?如果是这样,您可以使用LINQ来选择IEnumerabley中的元素,您应该寻找解决问题的方法,而不是使用某些特定的技术工具,除非您在这里的全部目的只是学习某些特定的技术工具。如果后者是正确的,那么这里就不适合使用匿名类,因此您应该找到一个更好的示例进行练习。这个答案解决了根本的问题。@Servy是什么使得这里不适合使用匿名类?
array[0]。Name
-属性值是在运行时使用
动态
类型确定的。考虑<代码>动态< /代码>,在这个例子中,就像<代码>对象< /代码>,除了可以调用不存在的属性/方法之外,这应该很好,在VisualStudio 2010中,我直接将您的ANONARAL代码粘贴到模板中,然后用FrAACH在数组上循环,所有的都很好,如我所料。您使用的是什么版本的VS?@GarethJ Visual Studio 2010。你用的是文本模板?是的。具体来说,我使用的是2010 SP1,但这不重要。@GarethJ类型的你好,我不明白。我发誓
var
以前不工作。我需要更深入地研究这一点。我们只是用一些样板文件扩展模板,然后通过CodeDOM在其上运行C编译器,所以一般来说,在C中工作的东西在T4中工作。如果您想查看我们正在编译的内容,请将模板代码粘贴到运行时(预处理)模板中,您将看到扩展。
Dictionary<string, int> set = 
  {
      { "apple", 4 },
      { "grape", 1 }
  }
dynamic[] array = new dynamic[] { new { Name = "Apple", Diam = 4 }, ... }
<#@ 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() #>
<# } #>