如何使用 EnvDTE 获取 class 的 using 语句?

How to get the using statements for a class using EnvDTE?

我正在开发一个 T4 模板,该模板基于现有的部分类生成部分类。

有时生成的代码会引用现有(非生成的)代码库中使用的类型。

生成的代码必须完全限定这些类型,或者模仿它在非生成代码中找到的 using 语句。

模仿 using 语句似乎更好,因为它将支持从 [Attribute(typeof(Something))] 引用类型的情况,其中 EnvDTE 仅 returns 字符串文字 "typeof(Something)"

那么:如何找到这些 using 语句?我正在使用有形的 T4 的 AutomationHelper,但似乎仍然找不到解决方案:(

您可以通过查看 ProjectItem 的 FileCodeModel.CodeElements 来获取 using 语句。

每个 ProjectItem 都有一个 FileCodeModel 属性。 FileCodeModel.CodeElements 将为每个 using 语句包含一个 CodeImport。请注意 FileCodeModel.CodeElements 将包含其他内容,而不仅仅是 CodeImportss o 您将需要检查返回的类型或过滤不需要的类型。

示例如下。我在这里使用 NuGet 的包管理器控制台和 PowerShell。

$p = Get-Project
$fileCodeModel = $p.ProjectItems.Item("Class1.cs").FileCodeModel
$fileCodeModel.CodeElements | % { $_.Namespace }

上面的代码假定项目的根目录中有一个 Class1.cs 文件。对于每个 using 语句,它将打印完整的命名空间。请注意,在上面的代码中,它试图为每个 CodeElement 打印命名空间,并且某些元素不会有此 属性,因此您需要对其进行限制,以便它仅查看 CodeImport 类型。以上将适用于以下 class 文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
    public class Class1
    {
    }
}

如果您在 namespace ClassLibrary1public class Class1 部分之间使用语句,您将需要做更多的工作并查看 CodeNamespace 成员,因为不能直接从 FileCodeModel.CodeElements 获得 CodeImports,但希望上面的代码能为您指明正确的方向。