2010-08-24 54 views
4

我已經得到了VS2010一個包,現在關注的我如何才能獲得EnvDTE當前項目中定義的類?

EnvDTE=>Solution=>Projects=>CodeModel=>CodeElements 

做遞歸以下和查找類

var q = elements.Cast<CodeElement>() 
      .Where(x => x is CodeClass || x is CodeNamespace) 
      .Where(x => x.Name.StartsWith("System") == false) 
      .Where(x=>x.Name.StartsWith("Infragistics")==false) 
      .Where(x=>x.Name.StartsWith("Microsoft")==false) 
      .Where(x => x.Name.StartsWith("ICSharpCode")==false); 

它運行很慢,有沒有辦法來此查詢/搜索限制只有當前項目中定義的類/類型?

據我所知FileCodeModel是既沒有用也不合適,因爲這將需要打開每個項目項目。

回答

3

,我使用來導航Project.CodeModel或ProjectItem.FileCodeModel的代碼元素的方式在本文中描述:

HOWTO:從VisualStudio.NET宏導航文件的代碼元素或加載項 http://www.mztools.com/articles/2006/MZ2006008.aspx

如果性能問題,請嘗試如果避免LINQ層增強性能。除此之外,自從EnvDTE返回的CodeElements集合返回所有代碼元素之後沒有太多的工作要做,並且在過濾之後。

+0

這個只要注意,它本身並不限制對項目中的類 - 它抓住他們,如果他們在任何地方引用(在有一個很好的協議的BCL的產生)。我現在只是在看這個,所以我沒有其他答案! – 2012-06-03 05:44:11

2

老問題,但我會發布這個以備將來參考。

當元素來自引用程序集時,CodeElement類上有一個InfoLocation屬性,它等於vsCMInfoLocation.vsCMInfoLocationExternal。

欲瞭解更多信息: http://msdn.microsoft.com/en-us/library/envdte.codeelement.infolocation.aspx

+0

在VS包的上下文中,獲取選定的項目並試圖通過類枚舉,似乎一切都正在返回'vsCMInfoLocationExternal',這意味着我可以區分我正在查看的項目中定義的東西和BCL的東西 – 2016-07-21 19:52:22

+1

@MattBurland我發現儘管命名空間,即使是隻在我的項目中定義的名稱空間,也被標記爲「外部」,但類和其他類型被正確標記爲「vsCMInfoLocationProject」。 – Dai 2016-09-06 10:45:32

相關問題