2013-01-15 72 views
9

我有創造的方式使用EnvDTE使用T4模板接口列出在我的項目中的所有類問題的項目收集用戶類的列表(基於命名約定),並且沒有任何文件的出似乎在描述如何去做。我開始與:使用EnvDTE

<#@ 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

我假設這是Visual Studio中。如果是這樣,你有沒有看過羅斯林? – Ameen

+2

請看這裏http://stackoverflow.com/a/6572941/157224關於尋找類與DTE – adrianm

+0

@adrianm我的答案,這看起來可能是什麼我要找的(一旦我翻譯成C#)...我會在早上嘗試這個。 –

回答

10

由於您使用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。但這種方式更容易閱讀。

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); 
+0

反思,不幸的是,當試圖自我反省時,所有的反應都被淹沒了。它緩存數據,並且在更改代碼時不一定會更新。 –

+0

是,只有在T4模板,怎麼一回事,因爲我從來沒有見過這個問題之前 –

+0

呀漂亮多了。 –