2010-08-24 24 views
4

J'ai un paquet pour VS2010 qui suit actuellementComment puis-je obtenir uniquement des classes définies dans le projet en cours dans EnvDTE?

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

effectuer les opérations suivantes récursive et trouver des cours

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); 

Il fonctionne assez lentement, est-il un moyen de limiter cette requête/recherche à seulement classes/types définis dans le projet en cours? Si je comprends bien, FileCodeModel n'est ni utile ni approprié car cela nécessiterait l'ouverture de chaque élément du projet.

Répondre

3

La façon dont j'utiliser pour naviguer dans les éléments de code d'un Project.CodeModel ou ProjectItem.FileCodeModel est décrit dans l'article:

Comment faire naviguer les éléments de code d'un fichier à partir d'une macro Visual Studio .NET ou add-in http://www.mztools.com/articles/2006/MZ2006008.aspx

Si les performances sont un problème, essayez d'éviter que la couche LINQ améliore les performances. A part cela, il n'y a pas grand chose à faire puisque les collections CodeElements renvoyées par EnvDTE renvoient tous les éléments de code et c'est par la suite quand vous filtrez.

+0

Il suffit de noter avec cela, il ne se limite pas à des classes au sein du projet - il les attrape s'ils sont référencés partout (obtenu avec une bonne partie de la BCL y). Je regarde juste cela maintenant, donc je n'ai pas de réponse alternative! –

2

Ancienne question, mais je vais poster ce pour référence future.

Il existe une propriété InfoLocation sur la classe CodeElement qui est égale à vsCMInfoLocation.vsCMInfoLocationExternal lorsqu'un élément provient d'un assembly référencé.

Pour plus d'informations: http://msdn.microsoft.com/en-us/library/envdte.codeelement.infolocation.aspx

+0

Dans le contexte d'un paquet VS, obtenant le projet sélectionné et essayant d'énumérer à travers les classes, il semble que tout retourne 'vsCMInfoLocationExternal' ce qui signifie que je peux faire la différence entre les choses définies dans le projet et le BCL –

+1

@ MattBurland Je trouve que même si les espaces de noms, même ceux définis dans mon projet, sont marqués comme Externe, les classes et autres types sont marqués comme 'vsCMInfoLocationProject' correctement. – Dai