Reflection 是否有方法枚举vb6类模块中的所有属性?

Reflection 是否有方法枚举vb6类模块中的所有属性?,reflection,vb6,Reflection,Vb6,在.Net中,您可以使用反射来访问类的所有属性的枚举。使用VB6类模块也能做到这一点吗?找到了 您需要设置对TypeLib库(tlbinf32.dll)的引用,然后可以使用以下代码(这是类模块): 编辑:不幸的是,下面的代码在VB6 IDE中以调试模式运行时可以正常工作,但在编译时失败。编译后,尝试读取.Members属性会导致“对象不支持此操作”错误(445)。我已经放弃了,除非有人能让下面的代码在IDE内外都工作 Option Explicit Private TLI As TLIAppli

在.Net中,您可以使用反射来访问类的所有属性的枚举。使用VB6类模块也能做到这一点吗?

找到了 您需要设置对TypeLib库(tlbinf32.dll)的引用,然后可以使用以下代码(这是类模块):

编辑:不幸的是,下面的代码在VB6 IDE中以调试模式运行时可以正常工作,但在编译时失败。编译后,尝试读取.Members属性会导致“对象不支持此操作”错误(445)。我已经放弃了,除非有人能让下面的代码在IDE内外都工作

Option Explicit
Private TLI As TLIApplication
Private m_clsInterface As InterfaceInfo
Private m_clsClassUnderInvestigation As Object

Private Sub Class_Terminate()

    Set m_clsClassUnderInvestigation = Nothing
    Set m_clsInterface = Nothing
    Set TLI = Nothing
End Sub


Public Sub FillListBoxWithMembers(pList As ListBox, Optional pObject As Object)
    Dim lMember As MemberInfo
    If pObject = Empty Then
        Set pObject = ClassUnderInvestigation
    End If
    Set m_clsInterface = TLI.InterfaceInfoFromObject(pObject)

    For Each lMember In m_clsInterface.Members
        pList.AddItem lMember.Name & " - " & WhatIsIt(lMember)
    Next

    Set pObject = Nothing
End Sub

Public Function GetPropertyLetNames() As Collection
    Dim filters(1 To 1) As InvokeKinds
    filters(1) = INVOKE_PROPERTYPUT
    Set GetPropertyLetNames = Filter(filters)
End Function

Public Function GetPropertySetNames() As Collection
    Dim filters(1 To 1) As InvokeKinds
    filters(1) = INVOKE_PROPERTYPUTREF
    Set GetPropertySetNames = Filter(filters)
End Function

Public Function GetPropertyLetAndSetNames() As Collection
    Dim filters(1 To 2) As InvokeKinds
    filters(1) = INVOKE_PROPERTYPUT
    filters(2) = INVOKE_PROPERTYPUTREF
    Set GetPropertyLetAndSetNames = Filter(filters)
End Function

Public Function GetPropertyGetNames() As Collection
    Dim filters(1 To 1) As InvokeKinds
    filters(1) = INVOKE_PROPERTYGET
    Set GetPropertyGetNames = Filter(filters)
End Function

Private Function Filter(filters() As InvokeKinds) As Collection
    Dim Result As New Collection
    Dim clsMember As MemberInfo
    Dim i As Integer

    For Each clsMember In m_clsInterface.Members
        For i = LBound(filters) To UBound(filters)
            If clsMember.InvokeKind = filters(i) Then
                Result.Add clsMember.Name
            End If
        Next i
    Next
    Set Filter = Result
End Function
Private Function WhatIsIt(lMember As Object) As String
    Select Case lMember.InvokeKind
        Case INVOKE_FUNC
            If lMember.ReturnType.VarType <> VT_VOID Then
                WhatIsIt = "Function"
            Else
                WhatIsIt = "Method"
            End If
        Case INVOKE_PROPERTYGET
            WhatIsIt = "Property Get"
        Case INVOKE_PROPERTYPUT
            WhatIsIt = "Property Let"
        Case INVOKE_PROPERTYPUTREF
            WhatIsIt = "Property Set"
        Case INVOKE_CONST
            WhatIsIt = "Const"
        Case INVOKE_EVENTFUNC
            WhatIsIt = "Event"
        Case Else
            WhatIsIt = lMember.InvokeKind & " (Unknown)"
    End Select
End Function

Private Sub Class_Initialize()
    Set TLI = New TLIApplication
End Sub

Public Property Get ClassUnderInvestigation() As Object

    Set ClassUnderInvestigation = m_clsClassUnderInvestigation

End Property

Public Property Set ClassUnderInvestigation(clsClassUnderInvestigation As Object)
    Set m_clsClassUnderInvestigation = clsClassUnderInvestigation
    Set m_clsInterface = TLI.InterfaceInfoFromObject(m_clsClassUnderInvestigation)
End Property
选项显式
作为TLI应用程序的专用TLI
作为接口信息的专用m_clsInterface
作为调查对象的私人m_CLSCLASS
私有子类_Terminate()
设置m_CLSCLASSUNDEVISIONE=无
设置m_clsInterface=Nothing
设置TLI=无
端接头
带有成员的公共子FillListBoxWithMembers(pList作为ListBox,可选POObject作为Object)
作为MemberInfo的Dim lMember
如果pObject=空,则
设置pObject=classunderinvestment
如果结束
设置m_clsInterface=TLI.InterfaceInfo对象(POObject)
对于m_clsInterface.Members中的每个lMember
pList.AddItem lMember.Name&“-”和WhatIsIt(lMember)
下一个
Set pObject=Nothing
端接头
公共函数GetPropertyLetNames()作为集合
调暗过滤器(1到1)作为调用索引
过滤器(1)=调用属性输出
设置GetPropertyLetNames=Filter(过滤器)
端函数
公共函数GetPropertySetNames()作为集合
调暗过滤器(1到1)作为调用索引
过滤器(1)=调用_PROPERTYPUTREF
设置GetPropertySetNames=Filter(过滤器)
端函数
公共函数getPropertyLeadSetNames()作为集合
调暗过滤器(1到2)作为调用索引
过滤器(1)=调用属性输出
过滤器(2)=调用_PROPERTYPUTREF
设置GetPropertyLeadSetNames=Filter(过滤器)
端函数
公共函数GetPropertyGetNames()作为集合
调暗过滤器(1到1)作为调用索引
过滤器(1)=调用属性集
设置GetPropertyGetNames=Filter(过滤器)
端函数
私有函数过滤器(过滤器()作为InvokeKinds)作为集合
将结果变暗为新集合
Dim CLS成员作为成员信息
作为整数的Dim i
对于m_clsInterface.Members中的每个CLS成员
对于i=LBound(过滤器)到UBound(过滤器)
如果clsMember.InvokeKind=filters(i),则
结果.添加clsMember.Name
如果结束
接下来我
下一个
设置过滤器=结果
端函数
私有函数WhatIsIt(lMember作为对象)作为字符串
选择Case lMember.InvokeKind
案例调用函数
如果lMember.ReturnType.VarType VT_VOID,则
WhatIsIt=“函数”
其他的
WhatIsIt=“方法”
如果结束
Case INVOKE_PROPERTYGET
WhatIsIt=“属性获取”
Case INVOKE_PROPERTYPUT
WhatIsIt=“物业出租”
Case INVOKE_PROPERTYPUTREF
WhatIsIt=“属性集”
案例调用常量
WhatIsIt=“Const”
Case INVOKE_EVENTFUNC
WhatIsIt=“事件”
其他情况
WhatIsIt=lMember.InvokeKind&(未知)
结束选择
端函数
私有子类_Initialize()
设置TLI=新的TLI应用程序
端接头
公共属性获取ClassUnderInvestigation()作为对象
设置ClassUnderSurvey=m_CLSClassUnderSurvey
端属性
正在调查的公共财产集类别(CLSClassUnderSurvey作为对象)
设置m_CLSCLASSUnderSurvey=CLSCLASSUnderSurvey
设置m_clsInterface=TLI.InterfaceInfo对象(m_CLSClass正在调查)
端属性

我非常喜欢。

非常正确,尽管它只适用于COM DLL项目或ActiveX EXE项目中的公共类模块。