使用EnvDTE收集项目中的用户类列表
本文关键字:用户 列表 项目 EnvDTE 使用 | 更新日期: 2023-09-27 17:53:37
我遇到了一个问题,创建一种方法来列出我的项目中使用EnvDTE
使用T4模板接口的所有类(基于命名约定),并且没有任何文档似乎描述如何做到这一点。我开始是:
<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ Assembly name="EnvDTE" #>
<#@ Assembly name="System.Core" #>
<#@ import namespace="EnvDTE" #>
<#@ Import Namespace="System.Linq" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#
var env = (DTE)((IServiceProvider)this.Host)
.GetService(typeof(EnvDTE.DTE));
…然后我开始偏离方向。我能够识别我的项目,但是我不能收集项目中的类,我想将这些类过滤到一个平面列表中,以便为它们创建接口。
我该怎么做?我只是想在我的项目类。
既然你正在使用T4,我建议你检查一下有形的T4编辑器。在他们的图库中有一个免费的可重用模板"有形的Visual Studio自动化助手"。有了这个模板,你可以很容易地找到代码类等(参见我对这篇文章的回答设计时间反射)。
如果你想自己做,你应该继续这样做:
var project = env.ActiveDocument.ProjectItem.ContainingProject;
foreach(EnvDTE.CodeElement element in project.CodeModel.CodeElements)
{
if (element.Kind == EnvDTE.vsCMElement.vsCMElementClass)
{
var myClass = (EnvDTE.CodeClass)element;
// do stuff with that class here
}
}
去掉了必要的递归。一个CodeElement可以包含其他的CodeElement。但是这样更容易阅读
我不太了解T4模板,但你可以使用Reflection
在一个得到你的类的
,
<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ Assembly name="EnvDTE" #>
<#@ Assembly name="System.Core" #>
<#@ import namespace="EnvDTE" #>
<#@ Import Namespace="System.Linq" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#@ Import Namespace="System.Reflection" #>
<#
var list = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsClass);