使用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));

…然后我开始偏离方向。我能够识别我的项目,但是我不能收集项目中的类,我想将这些类过滤到一个平面列表中,以便为它们创建接口。

我该怎么做?我只是想在我的项目类。

使用EnvDTE收集项目中的用户类列表

既然你正在使用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);