EnvDTE Извлечение типа данных из CodeElement - PullRequest
1 голос
/ 04 июня 2010

Я использую EnvDTE для генерации кода в моем последнем проекте.

У меня есть ссылка на CodeClass-Object для данного C # -Класса, но теперь я хотел просмотреть все его члены (в codeClass.Members) и проверить их типы.

Однако мне не удается получить тип данного члена из объекта CodeElement, который я получаю при циклическом просмотре codeClass.Members.

Как я могу получить тип (int, string и т. Д.)?

PS: Отражение не вариант для моего использования.

1 Ответ

5 голосов
/ 04 июня 2010

CodeElement имеет свойство Members, которое является коллекцией CodeElement. CodeElement имеет свойство Kind, из которого вы можете узнать, о каком члене мы говорим. Затем вы можете привести каждого члена к соответствующему интерфейсу и осмотреться. Большинство подклассов имеют свойство Type с информацией, которую вы ищете.

Я набрал это в редакторе макросов, в модуле:

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

Он просто берет класс, в котором находится курсор в редакторе, и отображает информацию о типе для любого поля или свойства.

...