Pregunta

Estoy usando EnvDTE para generar algún código en mi último proyecto.

Tengo una referencia a un CodeCLass-Object para una clase C#dada, pero ahora quería recorrer todos sus miembros (en CodeClass.Members) y verificar sus tipos.

Sin embargo, no puedo recuperar el tipo de miembro dado del CodeElement-Object que obtengo al pasar a través de CodeClass.Members.

¿Cómo puedo recuperar el tipo (int, string, etc.)?

PD: La reflexión no es una opción para mi USECase.

¿Fue útil?

Solución

CodeElement tiene la propiedad de los miembros, que es una colección de CodeElement. CodeElement tiene una propiedad amable, desde la cual puede saber de qué tipo de miembro estamos hablando. Luego puede lanzar a cada miembro a la interfaz apropiada y echar un vistazo a su alrededor. La mayoría de las subclases tienen una propiedad tipo, con la información que está buscando.

Escribí esto en el editor macro, en un módulo:

Public Sub DisplayStuff()

    Dim objTextSel As TextSelection
    Dim objCodeCls As CodeClass
    objTextSel = CType(DTE.ActiveDocument.Selection, TextSelection)
    objCodeCls = CType(objTextSel.ActivePoint.CodeElement(vsCMElement.vsCMElementClass), CodeClass)

    If objCodeCls Is Nothing Then
        MsgBox("Please launch this macro when the cursor is within a class")
        Exit Sub
    End If

    For Each elt As CodeElement2 In objCodeCls.Members

        Select Case elt.Kind

            Case vsCMElement.vsCMElementVariable

                Dim v As CodeVariable2 = CType(elt, CodeVariable2)

                MsgBox(v.Name & " is a variable of type " & v.Type.AsString)

            Case vsCMElement.vsCMElementProperty

                Dim p As CodeProperty2 = CType(elt, CodeProperty2)

                MsgBox(p.Name & " is of type " & p.Type.AsString)
        End Select


    Next
End Sub

Simplemente toma la clase donde el cursor está en el editor y muestra la información de tipo para cualquier campo o propiedad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top