Klassen, Methoden und Co. per Code generieren

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Im Beitrag “Visual Studio mit LINQPad: Project und ProjectItems” haben wir uns angesehen, wie Sie per Code auf Project-, Solution- und ProjectItem-Elemente zugreifen. Nun wollen wir uns den Umgang mit den ProjectItem-Objekten ansehen und herausfinden, wie wir beispielsweise den enthaltenen Code manipulieren können und Klassen, Prozeduren und Variablen anzulegen. Dazu benötigen wir einen Verweis auf das FileCodeModel-Objekt des jeweiligen ProjectItem-Elements. Wie wir das holen und was wir damit anstellen können, zeigt der vorliegende Artikel.

Nachdem wir im oben genannten Artikel gelernt haben, wie wir die Elemente eines Projekts referenzieren, durchlaufen und erstellen, wollen wir uns nun um den Inhalt der Elemente selbst kümmern, genau genommen um die Elemente, die Code enthalten. Für diese Zwecke gibt es das FileCodeModel, dass wir über die gleichnamige Eigenschaft eines jeden Project-Item-Elements referenzieren können. Die folgende Funktion soll uns das FileCodeModel-Element der Klasse liefern, dessen Namen wir mit dem Parameter strItem übergeben. Die Funktion holt mit der im Artikel Visual Studio mit LINQPad: Project und ProjectItems vorgestellten Funktion GetDTE einen Verweis auf das DTE-Objekt zur Programmierung von Visual Studio und mit der Funktion GetCurrentOrNewProject aus dem gleichen Artikel einen Verweis auf das aktuell in Visual Studio geöffnete Projekt. Ist aktuell kein Projekt geöffnet, wird ein neues Projekt erstellt. Danach ermitteln wir über die ProjectItems-Auflistung des Projekts das ProjectItem-Objekt mit dem Namen aus dem Parameter strItem. Schließlich ermitteln wir mit der Eigenschaft FileCodeModel einen Verweis auf das gewünschte FileCodeModel-Objekt, das wir mit der Return-Anweisung an die aufrufende Methode zurückgeben:

Public Function GetFileCodeModel(strItem As String) As EnvDTE80.FileCodeModel2
     Dim objDTE As EnvDTE80.DTE2
     Dim objProject As EnvDTE.Project
     Dim objProjectItem As EnvDTE.ProjectItem
     Dim objFileCodeModel As EnvDTE80.FileCodeModel2
     If GetDTE(objDTE) = True Then
         If GetCurrentOrNewProject(objProject) = True Then
             objProjectItem = objProject.ProjectItems.Item(strItem)
             Debug.Print(objProjectItem.Name)
             objFileCodeModel = Trycast(objProjectItem.FileCodeModel, EnvDTE80.FileCodeModel2)
         End If
     End If
     Return objFileCodeModel
End Function

Der Aufruf könnte dann etwa wie folgt aussehen, wobei wir die zu verwendende Klasse als Parameter übergeben. Danach können wir mit dem FileCodeModel experimentieren:

Dim objFileCodeModel As EnvDTE.FileCodeModel
objFileCodeModel = GetFileCodeModel("NeueKlasse.vb")
Debug.Print (objFileCodeModel.CodeElements.Count)

Beispiele zu diesem Artikel

Die Beispiele finden Sie in der Datei VisualStudioErweitern_Items.linq. Sie können die einzelnen Prozeduren aufrufen, indem Sie die Aufrufe in der Sub Main-Prozedur auskommentieren und Sub Main ausführen. Zum Ausprobieren der Prozeduren verwenden Sie das Tool LINQPad, dass Sie unter http://www.linqpad.net herunterladen können.

Eigenschaften und Methoden der FileCodeModel-Klasse

Die FileCodeModel-Klasse hat die folgenden Eigenschaften. Genau genommen schauen wir uns hier nicht die FileCodeModel-Klasse an, sondern das FileCodeModel2-Interface, das etwas mehr Möglichkeiten bietet und mit dem Namespace EnvDTE80 kommt:

  • CodeElements: Auflistung der Code-Elemente. Was genau Code-Elemente sind, schauen wir uns weiter unten an, nachdem wir einige angelegt haben.
  • DTE: Verweis auf das übergeordnete DTE-Objekt.
  • Language: Gibt eine GUID aus, welche die verwendete Sprache dieses FileCodeModel-Elements repräsentiert.
         Debug.Print (objFileCodeModel.Language)
           {B5E9BD33-6D3E-4B5D-925E-8A43B79820B4}
  • Parent: Ermittelt das übergeordnete Objekt.

Dies sind die Methoden der FileCodeModel-Klasse:

  • AddAttribute: Fügt ein Attribut wie zu einer Klasse hinzu.
  • AddClass: Fügt eine neue Klasse zum FileCodeModel hinzu.
  • AddDelegate: Fügt ein Delegate zum FileCodeModel hinzu.
  • AddEnum: Fügt eine Enumeration zum FileCodeModel hinzu.
  • AddFunction: Hinzufügen von Methoden, Funktionen, Property Get/Let/Set-Methoden und so weiter
  • AddImport: Füge eine Imports-Anweisung hinzu.
  • AddInterface: Hinzufügen eines Interfaces.
  • AddNamespace: Fügt einen Namespace hinzu.
  • AddStruct: Fügt eine Struktur hinzu.
  • AddVariable: Fügt eine Variable hinzu.
  • CodeElementFromPoint:
  • Remove:

Die meisten der hier genannten Add…-Methoden gibt es auch in der Klasse CodeClass. Das heißt, Sie erstellen erst ein CodeClass-Element, also eine Klasse, referenzieren diese mit einer Objektvariablen wie objClass und nutzen dann Methoden wie AddAttribute, AddBase, AddClass, AddDelegate, AddEnum, AddFunction, AddImplementedInterface, AddProperty, AddStruct oder AddVariable, um die entsprechenden Elemente zu einer Klasse hinzuzufügen. Darunter sind Methoden wie AddImplementedInterface oder AddProperty, die nicht für das FileCodeModel-Objekt bereitstehen.

In den folgenden Abschnitten erläutern wir die Methoden mal für das FileCodeModel-Objekt und mal für das CodeClass-Objekt.

Attribut hinzufügen mit AddAttribute

Mit der folgenden Anweisung fügen wir ein neues Attribut zu einem FileCodeModel hinzu:

objFileCodeModel.AddAttribute("NeuesAttribut","Wert")

Der Code in der Datei NeueKlasse.vb sieht danach wie folgt aus:

<Assembly: NeuesAttribut(Wert)>
Public Class NeueKlasse
End Class

Hinzufügen einer Klasse mit AddClass

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar