Cómo: Utilizar el objeto CodeModel para analizar código de Visual Basic
Actualización: noviembre 2007
Usar la jerarquía del objeto CodeModel2 constituye una alternativa a la tarea probablemente compleja de analizar el texto de un archivo de código. Se puede utilizar el objeto CodeModel2 para realizar las siguientes tareas:
Analizar la estructura del código.
Como base para documentar el código.
Los procedimientos siguientes dan por supuesto que ya se es capaz de obtener acceso al entorno de desarrollo de macros y de crear un proyecto de macros. Para obtener más información, vea Agregar proyecto de macros (Cuadro de diálogo).
El nivel raíz del objeto CodeModel2 contiene los espacios de nombres o éstos están anidados en otros objetos CodeNamespace. Esto refleja las limitaciones de sintaxis que existen en los espacios de nombres. Un espacio de nombres es un bloque de código de nivel superior o está contenido en otro espacio de nombres. Para utilizar los siguientes procedimientos, debe tener un proyecto abierto en el entorno de desarrollo integrado (IDE) de Visual Studio.
Nota: |
---|
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Estos procedimientos se desarrollaron con la Configuración general de desarrollo activa. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio. |
Para encontrar todos los espacios de nombres del proyecto
Escriba un método recursivo para recuperar todos los espacios de nombres de una aplicación.
El objeto CodeNamespace tiene una propiedad Members que contiene todos los CodeElements en el primer nivel del espacio de nombres.
' 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
Nota: Se pueden encontrar todos los espacios de nombres de un archivo de código fuente usando la propiedad FileCodeModel del objeto ProjectItem asociado a dicho archivo. Sin embargo, con este sistema sería necesario un ligero cambio en el método FindAllNamespaces .
Buscar el espacio de nombres predeterminado
El procedimiento anterior sólo devuelve los espacios de nombres definidos en la aplicación. Sin embargo, todos los proyectos de Visual Basic incluyen también un espacio de nombres predeterminado, que contiene todos los elementos de código de la aplicación, aunque la colección CodeElements no contenga ningún objeto CodeNamespace para dicho espacio. El espacio de nombres predeterminado se puede recuperar desde cualquier elemento CodeType de nivel superior.
Para encontrar el espacio de nombres predeterminado del proyecto
Pruebe los elementos de código de nivel superior del proyecto. Cualquier elemento de código que sea un CodeType devuelve el elemento CodeNamespace del proyecto.
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
Buscar clases
Las declaraciones de clase y los espacios de nombres se recuperan a través de recursos similares. Debido a que las clases pueden anidarse en otras clases, se pueden encontrar clases definidas tanto en espacios de nombres como en otras clases.
Para encontrar todas las clases del proyecto
Escriba un método recursivo, como el siguiente, para buscar las declaraciones de clases de un proyecto.
' 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
Vea también
Tareas
Cómo: Crear una clase de C# con el objeto CodeModel
Conceptos
Información general del objeto CodeModel en aplicaciones de Visual Basic y C#
Detectar código utilizando el modelo de código (Visual Basic)