Как я могу получить только классы, определенные в текущем проекте в EnvDTE? - PullRequest
4 голосов
/ 25 августа 2010

У меня есть пакет для 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 бесполезен и не уместен, так как для этого потребуется открыть Item каждого проекта.

Ответы [ 2 ]

3 голосов
/ 25 августа 2010

Способ, которым я пользуюсь для навигации по элементам кода Project.CodeModel или ProjectItem.FileCodeModel, описан в статье:

HOWTO: навигация по элементам кода файла из макроса Visual Studio .NET или надстройки. http://www.mztools.com/articles/2006/MZ2006008.aspx

Если производительность является проблемой, попробуйте, если избегание уровня LINQ повышает производительность. Кроме этого, делать особо нечего, поскольку коллекции CodeElements, возвращаемые EnvDTE, возвращают все элементы кода, и это происходит после фильтрации.

2 голосов
/ 27 января 2014

Старый вопрос, но я опубликую его для дальнейшего использования.

В классе CodeElement есть свойство InfoLocation, которое равно vsCMInfoLocation.vsCMInfoLocationExternal, когда элемент поступает из ссылочной сборки.

Для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/envdte.codeelement.infolocation.aspx

...