Sdílet prostřednictvím


Jak: CodeModel objekt použít k analýze kódu Visual Basic

Použití CodeModel2 hierarchie objektů je alternativní rozložení textu v kódu souboru potenciálně složité úlohy.Můžete použít CodeModel2 objekt:

  • Analyzovat strukturu kódu.

  • Jako základ pro dokumentování kódu.

Následující postupy předpokládají, že víte, jak přístupu makra vývojové prostředí a vytváření maker.Další informace naleznete v tématu Add Macro Project Dialog Box.

Obory názvů, které jsou obsaženy v kořenové úrovni CodeModel2 objektu nebo vnořené v jiných CodeNamespace objektů.To odpovídá syntaxi omezení pro obory názvů.Obor názvů je blok kódu nejvyšší úrovně nebo v jiném oboru názvů.Chcete-li použít následující postupy, musí mít projekt otevřete Visual Studio integrované vývojové prostředí (IDE).

[!POZNÁMKA]

Dialogová okna a příkazy v nabídkách menu, které vidíte, se mohou lišit od těch popsaných v nápovědě, v závislosti na vašich aktivních nastaveních nebo edici.Tyto postupy byly vyvinuty s aktivní Obecné nastavení pro vývoj.Chcete-li změnit nastavení, zvolte Import and Export Settings v menu Nástroje.Další informace naleznete v tématu Nastavení aplikace Visual Studio.

Najít všechny obory obsažené v projektu

  • Psát rekurzivní metodu načtení obory názvů v aplikaci.

    CodeNamespace Má objekt Members vlastnost, která obsahuje všechny CodeElements na první úrovni oboru názvů.

    ' Macro editor
    Sub FindAllNamespaces()
       Dim cm As CodeModel
       cm = DTE.Solution.Projects.Item(1).CodeModel
    
       ' Look for all the namespaces in the CodeElements
       ' of the project.
       Dim list As String
       Dim ce As CodeElement
       For Each ce In cm.CodeElements
          If TypeOf ce Is CodeNamespace Then
             GetNamespace(CType(ce, CodeNamespace), list)
          End If
       Next
    
       MsgBox(list)
    End Sub
    
    Sub GetNamespace(ByVal ns As CodeNamespace, ByRef list As String)
       ' Add this namespace to the list.
       list &= ns.Name & ControlChars.CrLf
       Dim aspace As CodeNamespace
       Dim ce As CodeElement
       ' Look for more namespaces.
       For Each ce In ns.Members
          If TypeOf ce Is CodeNamespace Then
             GetNamespace(CType(ce, CodeNamespace), list)
          End If
       Next
    End Sub
    

    [!POZNÁMKA]

    Všechny obory názvů do jednoho zdrojového souboru můžete najít pomocí FileCodeModel vlastnost ProjectItem objektu přiřazeného zdrojového souboru.Použití tohoto přístupu by vyžadovala drobné změny FindAllNamespaces metoda.

Výchozí obor hledání

Výše uvedený postup vrátí pouze obory názvů, které jste definovali v aplikaci.Každý Visual Basic projektu obsahuje také výchozí obor názvů.Prvky kódu v aplikaci jsou obsaženy ve výchozí obor názvů, přestože CodeElements kolekce neobsahuje CodeNamespace objektu pro něj.Výchozí obor názvů lze načíst z všechny nejvyšší úrovně CodeType prvku.

Najít výchozí obor názvů pro projekt

  • Test prvky nejvyšší úrovně kódu projektu.Každý prvek kód, který je CodeType vrátí CodeNamespace prvek projektu.

    Sub FindDefaultNamespace()
       Dim cm As CodeModel
       cm = DTE.Solution.Projects.Item(1).CodeModel
    
       Dim ce As CodeElement
       Dim ct As CodeType = Nothing
       Dim defNameSpace As CodeNamespace
       For Each ce In cm.CodeElements
          If TypeOf ce Is CodeType Then
             ct = CType(ce, CodeType)
             defNameSpace = ct.Namespace
          End If
       Next
    
       If Not IsNothing(defNameSpace) Then
          MsgBox(defNameSpace.Name)
       End If
    End Sub
    

Hledání tříd

Deklarace třídy a obory názvů jsou načteny podobné prostředky.Protože třídy mohou být vnořené do jiných tříd, třídy definované obory názvů a třídy můžete najít.

Vyhledání všech tříd obsažených v projektu

  • Psát rekurzivní metody, jako je například následující hledání deklarace tříd v projektu.

    ' Macro editor
    Sub FindAllClasses()
       Dim cm As CodeModel
       cm = DTE.Solution.Projects.Item(1).CodeModel
    
       ' Look for all the namespaces and classes in the 
       ' project.
       Dim list As String
       Dim ce As CodeElement
       For Each ce In cm.CodeElements
          If (TypeOf ce Is CodeNamespace) Or (TypeOf ce Is CodeClass) Then
             ' Determine whether that namespace or class 
             ' contains other classes.
             GetClass(ce, list)
          End If
       Next
    
       MsgBox(list)
    End Sub
    
    Sub GetClass(ByVal ct As CodeElement, ByRef list As String)
       ' ct could be a namespace or a class. Add it to the list
       ' if it is a class.
       If (TypeOf ct Is CodeClass) Then
          list &= ct.Name & ControlChars.CrLf
       End If
    
       ' Determine whether there are nested namespaces or classes that 
       ' might contain other classes.
       Dim aspace As CodeNamespace
       Dim ce As CodeElement
       Dim cn As CodeNamespace
       Dim cc As CodeClass
       Dim elements As CodeElements
       If (TypeOf ct Is CodeNamespace) Then
          cn = CType(ct, CodeNamespace)
          elements = cn.Members
       Else
          cc = CType(ct, CodeClass)
          elements = cc.Members
       End If
    
       For Each ce In elements
          If (TypeOf ce Is CodeNamespace) Or (TypeOf ce Is CodeClass) Then
             GetClass(ce, list)
          End If
       Next
    End Sub
    

Viz také

Úkoly

Jak: vytvoření třídy C# pomocí objektu CodeModel

Koncepty

Přehled objektu CodeModel jazyka Visual Basic a C# aplikací

Zjištění kódu pomocí kódu modelu (Visual Basic)

Zjištění kódu pomocí kódu modelu (Visual C#)