2010-08-24 2 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: ОбзорТерминал элементов кода файла из визуального макро Studio .NET или надстройка http://www.mztools.com/articles/2006/MZ2006008.aspx

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

+0

Просто обратите внимание с этим, он не ограничивает себя классы в рамках проекта - она ​​захватывает их, если они ссылаются в любом месте (в результате с хорошей сделкой в ​​BCL в там). Я просто смотрю на это сейчас, поэтому у меня нет альтернативного ответа! –

2

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

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

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

+0

В контексте пакета VS, получая выбранный проект и пытаясь перечислить классы, кажется, что все возвращается 'vsCMInfoLocationExternal', что я могу сказать разницу между данными, определенными в проекте, на который я смотрю, и материалами BCL –

+1

@MattBurland Я считаю, что, хотя пространства имен, даже те, которые определены только в моем проекте, отмечены как внешние, классы и другие типы отмечены как 'vsCMInfoLocationProject' правильно. – Dai