我在使用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));
......然后我开始侧身。我能够识别我的项目,但是我无法在项目中收集我想要过滤到用于创建接口的平面列表中的类。
我该怎么做?我只想要项目中的课程。
答案 0 :(得分:11)
由于您使用的是T4,我建议您查看tangible T4 Editor。在他们的画廊中是一个免费的可重复使用的模板“有形的Visual Studio Automation Helper”。使用此模板,您可以轻松找到代码类等。(请参阅我对这篇文章的回答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可以包含其他CodeElements。但这种方式更容易阅读。
答案 1 :(得分: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);