【问题标题】:Collect a list of user classes in a project using EnvDTE使用 EnvDTE 收集项目中的用户类列表
【发布时间】:2013-01-15 20:35:56
【问题描述】:

我在创建一种使用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));

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

我该怎么做?我只想要项目中的类。

【问题讨论】:

  • 我假设这是 Visual Studio。如果是这样,你有没有看过罗斯林?
  • 在这里查看我的答案stackoverflow.com/a/6572941/157224关于使用 DTE 查找课程
  • @adrianm,这看起来可能是我正在寻找的东西(一旦我翻译成 c#)......我会在早上试试这个。

标签: c# t4 envdte


【解决方案1】:

由于您使用的是 T4,我建议您查看 tangible T4 Editor。在他们的画廊中有一个免费的可重用模板“有形的 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。但是这样更容易阅读。

【讨论】:

    【解决方案2】:

    我对 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);
    

    【讨论】:

    • 不幸的是,在尝试自我反思时,反思会变得很糟糕。它会缓存数据,并且在您更改代码时不一定会更新。
    • 这只是在 T4 模板中,因为我以前从未见过这个问题
    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 2019-05-30
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多