Вопрос

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

У меня есть ссылка на кодексок-объект для данного C#-класса, но теперь я хотел пройти через всех его членов (в Codeclass.members) и проверить их типы.

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

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

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

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top