如何使用 EnvDTE 获取类的 using 语句
本文关键字:using 语句 获取 何使用 EnvDTE | 更新日期: 2023-09-27 18:36:42
我正在研究一个 T4 模板,该模板基于现有的分部类生成分部类。
有时,生成的代码将引用从现有(未生成的)代码库中使用的类型。
生成的代码必须完全限定这些类型,或者模拟它在未生成的代码中找到的using
语句。
模仿using
语句似乎更好,因为它将支持从[Attribute(typeof(Something))]
引用类型的情况,其中 EnvDTE 仅返回字符串文字"typeof(Something)"
。
那么:我如何使用语句找到这些语句?我正在使用有形的T4的自动化助手,但似乎仍然找不到解决方案:(
您可以通过查看 ProjectItem 的 FileCodeModel.CodeElements 来获取 using 语句。
每个项目项都有一个文件代码模型属性。FileCodeModel.CodeElements 将包含每个 using 语句的 CodeImport。请注意,FileCodeModel.CodeElements将包含其他内容,而不仅仅是CodeImportss,您需要检查返回的类型或过滤不需要的类型。
下面显示了一个示例。在这里,我使用的是NuGet的Package Manager Console和PowerShell。
$p = Get-Project
$fileCodeModel = $p.ProjectItems.Item("Class1.cs").FileCodeModel
$fileCodeModel.CodeElements | % { $_.Namespace }
上面的代码假定项目的根目录中有一个 Class1.cs 文件。对于每个 using 语句,它将打印完整的命名空间。请注意,在上面的代码中,它尝试打印每个 CodeElement 的命名空间,并且某些元素将不具有此属性,因此您需要限制此属性,以便它只查看 CodeImport 类型。以上将适用于以下类文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibrary1
{
public class Class1
{
}
}
如果在命名空间 ClassLibrary1 和公共类 Class1 部分之间有 using 语句,则需要做更多的工作并查看 CodeNamespace 成员,因为 CodeImports 不能直接从 FileCodeModel.CodeElements 获得,但希望上面的代码应该为你指明正确的方向。