无法从T4模板

时间:2015-10-02 09:43:09

标签: c# t4

我想浏览以下枚举的所有值

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会导致错误,说明类型或命名空间&#39; Ord&#39;无法找到。如果我在T4Demo.前面添加前缀,或者我在模板中添加<#@ import namespace="T4Demo" #>,则会告诉我&#39; T4Demo&#39;无法找到。我忽略了什么?

修改

这是IntelliSense在尝试输入T4Demo时给我的。我自己的类型没有列在这里......所以我必须错过一些使用等。

IntelliSense

3 个答案:

答案 0 :(得分:1)

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

没有简单的方法来解决这个问题。您可以使用T4 include directive在模板代码中包含枚举代码,但是您可能会稍微与之抗争。

答案 1 :(得分:0)

尝试指定枚举的确切位置,就像您在星期几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 #>)
<#
  }
#>

答案 2 :(得分:0)

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

重要的是要知道,无论何时更改项目并重新编译,模板都不会重新运行。所以在我的情况下,每当我更改代码中的枚举时,我都会编译并从解决方案资源管理器中的模板文件的上下文菜单中选择“运行自定义工具”,以确保模板的输出与代码中的枚举更改匹配。 / p>