10

我在创建一种方法来列出我的项目中的所有类时遇到问题,该方法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));

......然后我开始横着走。我能够识别我的项目,但我无法将项目中的类收集到我想过滤到一个平面列表中以创建接口。

我怎样才能做到这一点?我只想要我项目中的课程。

4

2 回答 2

12

由于您使用的是 T4,我建议您查看有形的 T4 编辑器。在他们的画廊中有一个免费的可重用模板“有形的 Visual Studio 自动化助手”。使用此模板,您可以轻松找到代码类等(请参阅我对这篇文章Design Time Reflection的回答)。

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

    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。但这种方式更容易阅读。

于 2013-01-18T15:50:51.680 回答
0

我对 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);
于 2013-01-15T21:18:36.163 回答