Ich versuche ein Plugin für Visual Studio 2015 zu entwickeln. Ich habe Befehl, der zum Kontextmenü hinzugefügt wird, wenn ein Projekt mit der rechten Maustaste angeklickt wird und ich das Projekt, das richtig geklickt wurde, abrufen kann. Jetzt versuche ich festzustellen, ob das Projekt eine Klasse enthält, die eine bestimmte Schnittstelle implementiert. Also ist mein erster Schritt, die Klassen in das Projekt zu bekommen. Also habe ich so etwas wie dieses:Ermitteln, ob CodeElement zum Projekt gehört
protected IEnumerable<EnvDTE.CodeClass> GetClasses(EnvDTE.CodeElements elements,
EnvDTE.Project project)
{
foreach (EnvDTE.CodeElement element in elements)
{
System.Diagnostics.Debug.WriteLine(element.InfoLocation);
var cls = element as EnvDTE.CodeClass;
if (cls != null)
{
yield return cls;
}
var ns = element as EnvDTE.CodeNamespace;
if (ns != null)
{
foreach (var childCls in GetClasses(ns.Members, project))
{
yield return childCls;
}
}
}
}
So wird dies durchlaufen und Klassen herausziehen. Das Problem besteht darin, dass alles, was referenziert wird, BCL-Klassen umfasst. Ich dachte, mit InfoLocation
könnte helfen, aber alles zurück vsCMInfoLocationExternal
(vermutlich, weil in dem Kontext, in dem das Plugin ausgeführt wird, sind sie extern). Ich habe versucht, Dinge wie element.ProjectItem
und element.ProjectItem.ContainingProject
und element.Parent
mit der Hoffnung, das mit dem übergeordneten Projekt zu vergleichen, aber diese alle werfen System.Runtime.InteropServices.COMException
. Also gibt es einen Weg, da ich das Projekt kenne, um festzustellen, ob ein bestimmter CodeElement
Teil des Projekts ist, oder nur von dem Projekt referenziert?
EDIT: Das Beste, was ich habe in der Lage gewesen, mit so weit zu kommen, dies zu tun, erhalten zunächst das Standard-Namespace für das Projekt:
var defaultNS = project.Properties.Item("DefaultNamespace").Value.ToString();
Und dann kann ich dies tun:
if (ns != null && ns.Name == defaultNS)
So jetzt werde ich nicht gehen hinunter in System
, was gut ist. Das einzige Problem wäre, wenn ein Projekt mehrere Namespaces hätte, die ich durchsuchen wollte. Ich kann nicht herausfinden, ob es eine Möglichkeit gibt, eine Liste von Namespaces zu erhalten, die im Projekt definiert sind.
Edit: Die vorgeschlagene dupe befasst sich mit Type
so ist nicht ganz relevant.
ich diese Kennzeichnung als dup von http://stackoverflow.com/questions/3174921/how-do-i-determine-if-system-type-is-a-custome-type-or -a-framework-type, weil es wirklich keine Möglichkeit gibt, dies innerhalb oder außerhalb einer vs-Erweiterung zu tun. –
@PaulSwetz: Es kann sein, dass es keine Möglichkeit gibt, es zu tun, aber der vorgeschlagene Betrogene ist nicht das Gleiche und ist hier nicht hilfreich. Ich habe nicht den "Typ", ich habe ein 'CodeElement', daher sind Vorschläge mit' Typ' nicht relevant. –
Ich könnte eine Antwort aufsetzen, die rund um was Sie wollen, indem Sie herausfinden, welche Klasse/enum/Strukturen in einem Codeelement von externen Referenz vs in Lösungsdefinitionen kommen. Es * kann * passen Sie Ihre Bedürfnisse, kann nicht sagen, es sehr effizient, obwohl es sehr rekursiv. –