繁体   English   中英

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

[英]How to get the using statements for a class using EnvDTE?

我正在研究一个T4模板,该模板根据现有的部分类生成部分类。

有时,生成的代码将引用现有(未生成)代码库中正在使用的类型。

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

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

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

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

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

一个例子如下所示。 在这里,我正在使用NuGet的Package Manager控制台和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部分之间使用了语句,则由于CodeImports不能直接从FileCodeModel.CodeElements获得,因此您需要做更多的工作并查看CodeNamespace成员,但希望上面的代码能为您提供帮助在正确的方向。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM