如何在T4中使用linq扩展方法

use*_*570 1 .net-4.0 c#-4.0

我已经堆栈溢出和谷歌搜索一段时间试图找到如何在T4文件中使用Linq扩展方法的答案.我正在使用VS 2012,.NET 4.5.

例如:

Dictionary<string, string> myDict = new Dictionary<string, string>();
myDict = GetSomeData();
Run Code Online (Sandbox Code Playgroud)

让我们说我想得到字典中的最后一项:

<#string last = colNames.Keys.Last();#>
Run Code Online (Sandbox Code Playgroud)

它不介意我使用集合,但它不喜欢".Last()".

编译转换:'System.Collections.Generic.Dictionary.KeyCollection'不包含'Last'的定义,也没有扩展方法'Last'接受类型为'System.Collections.Generic.Dictionary.KeyCollection'的第一个参数' (您是否缺少using指令或程序集引用?)

我已经导入了必要的命名空间......

编辑 - >为了清楚起见......我在T4模板的顶部有以下内容:

<#@ assembly name="$(SolutionDir)\SomeProject\bin\Debug\System.Data.Linq.Dll" #>
<#@ import namespace="System.Data.Linq" #>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?提前致谢.

Fed*_*gui 5

确保您的T4模板包含一个引用的正确的Assembly DirectiveSystem.Core.dll,这是定义LINQ的地方:

<#@ assembly name="System.Core"#>
Run Code Online (Sandbox Code Playgroud)

这相当于常规C#项目中的"Add Reference ...".

然后确保您具有适当的命名空间导入指令System.Linq:

<#@ import namespace="System.Linq"#>
Run Code Online (Sandbox Code Playgroud)

这相当于using常规C#代码中的指令.

.tt文件顶部添加这些内容.

  • @user3219570 `System.Core` 命名空间不存在。它称为“System.Linq”,在“System.Core.dll”程序集中定义。你确定你做对了吗? (2认同)