【问题标题】:How can I get only classes defined in the current project in EnvDTE?如何在 EnvDTE 中仅获取当前项目中定义的类?
【发布时间】:2010-08-24 20:38:34
【问题描述】:

我有一个适用于 Vs2010 的包,目前紧随其后

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 既无用也不合适,因为这需要打开每个项目项。

【问题讨论】:

    标签: envdte


    【解决方案1】:

    文章中描述了我用来导航 Project.CodeModel 或 ProjectItem.FileCodeModel 的代码元素的方式:

    HOWTO:从 Visual Studio .NET 宏或加载项导航文件的代码元素 http://www.mztools.com/articles/2006/MZ2006008.aspx

    如果性能是一个问题,请尝试避免 LINQ 层是否可以提高性能。除此之外没有什么可做的,因为 EnvDTE 返回的 CodeElements 集合会返回所有代码元素,然后在您过滤时返回。

    【讨论】:

    • 请注意这一点,它不会将自己限制在项目中的类中——如果它们在任何地方被引用,它就会抓住它们(导致那里有大量的 BCL)。我现在只是在看这个,所以我没有其他答案!
    【解决方案2】:

    老问题,但我会发布这个以供将来参考。

    当元素来自引用的程序集时,CodeElement 类上有一个等于 vsCMInfoLocation.vsCMInfoLocationExternal 的 InfoLocation 属性。

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

    【讨论】:

    • 在 VS 包的上下文中,获取所选项目并尝试枚举类,似乎所有内容都返回 vsCMInfoLocationExternal,这意味着我可以分辨项目中定义的内容之间的区别我'我在看和 BCL 的东西
    • @MattBurland 我发现虽然命名空间,即使是仅在我的项目中定义的命名空间,也被标记为外部,类和其他类型被正确标记为vsCMInfoLocationProject
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多