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

Jer*_*acs 9 c# t4 envdte

我在创建一种方法来创建一种方法来列出我的项目中的所有类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));
Run Code Online (Sandbox Code Playgroud)

......然后我开始侧身.我能够识别我的项目,但是我无法在项目中收集我想要过滤到用于创建接口的平面列表中的类.

我怎样才能做到这一点?我只想要我的项目中的类.

Nic*_*ico 11

由于您使用的是T4,我建议您查看有形的T4编辑器.在他们的画廊中是一个免费的可重复使用的模板"有形的Visual Studio Automation Helper".使用此模板,您可以轻松找到代码类等.(请参阅我对本文" 设计时间反射"的回答).

如果你想自己做,你应该继续这样:

    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
    }
}
Run Code Online (Sandbox Code Playgroud)

我删除了必要的递归.CodeElement可以包含其他CodeElements.但这种方式更容易阅读.