2010-08-24 22 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

相关问题