2010-06-03 81 views
1

我正在使用EnvDTE在我的最新项目中生成一些代码。EnvDTE从CodeElement检索数据类型

我有一个给定的C#类的CodeClass对象的引用,但现在我想遍历所有它的成员(在codeClass.Members)并检查它们的类型。

但是,我无法设法从循环访问codeClass.Members时得到的CodeElement-Object中获取给定成员的类型。

如何检索类型(int,字符串等)? PS:反射不是我的用例的选项。

回答

5

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 

,只是需要的类,它是当光标在编辑器中,并显示任何字段或属性的类型信息。