无法从 T4 模板中找到类型

Type cannot be found from T4 template

我想遍历以下枚举的所有值

namespace T4Demo
{
  public enum Ord
  {
    First,
    Second
  }
}

在我的模板中

<#@ template debug="true" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".txt" #>
<# 
  var arr = System.Enum.GetValues(typeof(System.DayOfWeek));
  foreach(var it in arr)
  {
    string name = it.ToString();
    string value = ((int)it).ToString();
#>
    <#= name #>(<#= value #>)
<#
  }
#>

为了输出它们。它适用于 System.DayOfWeek 并输出

Sunday(0)
Monday(1)
Tuesday(2)
Wednesday(3)
Thursday(4)
Friday(5)
Saturday(6)

但尝试使用 Ord 会导致出现错误,提示无法找到类型或命名空间 'Ord'。如果我在它前面加上 T4Demo. 或者如果我在模板中添加 <#@ import namespace="T4Demo" #> 它告诉我找不到 'T4Demo' 。我忽略了什么?

编辑:

这是 IntelliSense 在尝试输入 T4Demo 时给我的提示。我自己的类型没有在这里列出...所以我一定是遗漏了一些 using 等

尝试指定枚举的确切位置,就像您对星期几 Arry 所做的那样。

System.Enum.GetValues(typeof(System.DayOfWeek));

然后应该变成

System.Enum.GetValues(typeof(MyEnumLocation.Ord));

编辑

<#@ template debug="true" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".txt" #>
@model <#= ViewDataTypeName #> // Added this line
<# 
  var arr = System.Enum.GetValues(typeof(System.DayOfWeek)); // This line is no longer required
  foreach(var item in model) // Changed this line
  {
    string name = item.ToString();
    string value = ((int)it).ToString();
#>
    <#= name #>(<#= value #>)
<#
  }
#>

您的 T4 模板本身就是一个程序,您在主程序中定义的类型不是它的一部分。

没有简单的方法来解决这个问题。您可能会使用 T4 include directive 将枚举代码包含在模板代码中,但您可能会遇到一些麻烦。

正如 Nicolas Repiquet 所指出的,T4 模板本身就是一个程序。因此,解决方案是在模板 header 中添加 <#@ assembly name="$(TargetPath)" #>,这使得我在同一项目中的所有类型都在模板中可见。

重要的是要知道,无论何时更改和重新编译项目,模板都不会重新运行。因此,就我而言,每当我更改代码中的枚举时,我都会从解决方案资源管理器中的模板文件的上下文菜单中进行编译和 select 'Run custom tool',以确保我的模板输出与枚举更改相匹配在代码中。