Como: usar o objeto CodeModel para analisar o código de Visual Basic
Usando o CodeModel2 a hierarquia de objeto é uma alternativa para a tarefa potencialmente complexa de análise de texto em um arquivo de código.Você pode usar o CodeModel2 objeto:
Para analisar a estrutura do seu código.
Como base para documentar o seu código.
Os procedimentos a seguir pressupõem que você saiba como acessar o ambiente de desenvolvimento de Macros e criar um projeto de macro.Para obter mais informações, consulte Add Macro Project Dialog Box.
Namespaces estão contidos no nível da raiz do CodeModel2 object ou aninhados em outros CodeNamespace objetos.Isso reflete as restrições de sintaxe nos espaços para nome.Um espaço para nome é um bloco de código de nível superior ou contido em outro espaço para nome.Para usar os procedimentos a seguir, você deve ter um projeto aberto no Visual Studio o ambiente de desenvolvimento integrado (IDE).
Observação |
---|
As caixas de diálogo e comandos de menu demonstradas podem ser diferentes daqueles descritos na Ajuda, dependendo das configurações ativas ou configurações de edição.Esses procedimentos foram desenvolvidos com o General Development Settings ativo.Para alterar as configurações, escolha Import and Export Settings sobre o Ferramentas menu.Para obter mais informações, consulte Configurações de Visual Studio. |
Para localizar todos os namespaces contidos em seu projeto.
Escreva um método recursivo para recuperar todos os namespaces em um aplicativo.
O CodeNamespace objeto tem um Members propriedade que contém todas as CodeElements no primeiro nível do namespace.
' 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
Observação Você pode encontrar todos os namespaces no mesmo arquivo de origem usando o FileCodeModel propriedade da ProjectItem objeto associado com o arquivo de origem.Usar essa abordagem exigiria uma pequena alteração para o FindAllNamespaces método.
Localizando o Namespace padrão
O procedimento acima retorna apenas os namespaces que você definiu em seu aplicativo.Cada Visual Basic projeto também contém um espaço para nome padrão.Todos os elementos de código em seu aplicativo estão contidos no namespace padrão, embora o CodeElements coleção não contém um CodeNamespace o objeto para ele.O namespace padrão pode ser recuperado a partir de qualquer nível superior CodeType elemento.
Para localizar o namespace padrão para seu projeto.
Teste os elementos de código de nível superior do projeto.Qualquer elemento de código que seja um CodeType retorna o CodeNamespace elemento para o projeto.
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
Localizando Classes
Namespaces e declarações de classe são recuperados através de meios semelhantes.Porque classes podem ser aninhadas em outras classes, você pode localizar as classes definidas nos namespaces e em outras classes.
Para localizar todas as classes contidas no seu projeto.
Escreva um método recursivo, como aquele que se segue, para localizar as declarações de classe em um projeto.
' 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
Consulte também
Tarefas
Como: criar uma classe C# usando o objeto CodeModel
Conceitos
Visão geral do objeto CodeModel para Visual Basic e C# aplicativos
Descobrindo o código usando o modelo de código (Visual Basic)