后绑定方式下对Object的处理

类别:.NET开发 点击:0 评论:0 推荐:

后绑定方式下对Object的处理

 

CallByName , TypeName , CreateObject 以及 TypeLib库的组合使用

 

在大多数的Visual Basic编程中,关于对象的操作都是在明确对象类型的情况下进行的,开发者会定义一个对象为某某类,这样就会很清楚使用的Object是属于什么类(Class),都有些什么属性(Property),有哪些方法(Method)。

 

   但是有些时候也会有这样一种需求 , 要去实现一个操作不确定类型对象的函数 , 函数包含一个 As Object的参数 , 函数运行时也会有不确定类型的中间对象。这时候下面三个函数和一个DLL的组合会提供在后绑定模式下我们需要的帮助。

 

1)  TypeName (VarName) As String

    这个函数将返回参数的数据类型 , 对于对象类型将返回该对象的类名。

    例如:

    Dim objRS As Recordset

    Debug.Print TypeName(objRS)

    将Print 出字符串 “Recordset”

 

2)  CreateObject(Class As String, [ServerName As String])

CreateObject这个函数比较常用 , 相对于直接定义一个对象 , 他的好处就是可以在后期通过一个字符串作为类的标示来创建对象。这样就可以在函数的运行期通过某种方式(当然也包括上面提到的TypeName函数)

确定具体要创建什么类型的对象 , 而不必在编码的阶段确定下来 , 因为那并不符合要求。

例如:

Set ObjNew = CreateObject(TypeName(p_objDest))

将在函数体的某一处创建一个与参数对象同类型的中间对象。

 

 

 

3) Function CallByName(Object As Object, ProcName As String, _

CallType As VbCallType, [Args() As Variant])

 

在解决了类的问题后 ,还要面对的就是对Object的Method的调用。很显然仅仅Create 一个Object是不够的 , 但是对于不确定的类 , 具有的Method 也是不确定的 , 所以在函数体内也不可以写死。

CallByName函数就可以解决这个调用的问题。在函数运行时 , 通过某种方式(可能是传入的参数 ,也有可能使下面的TypeLib库提供的帮助)得知要使用的Method后的名字后 , CallByName 就可以使用这个Method的名字(字符串)对他进行调用。

例如:

CallByName(objDest , p_strMethodName , vbMethod , 12) ‘p_strMethodName = “Test”

将等同于 Call objDest.Test(12)

 

4)     TypeLib Information 库。

 

       这个DLL可以用来对任意类型对象的属性及接口遍历 , 并且对这些接口进行十分细致的分解。

下面的代码是一个简单的使用TypeLib的例子:


 

Public Function GetPropFromObject(ByRef objDest As Object)

 

    Dim objTypeLib As TLI.InterfaceInfo

    Dim objProp As TLI.MemberInfo

    Dim lngCnt As Long

   

On Error GoTo Error_Handler

   

    ‘ 读objDest 的接口信息

    Set objTypeLib = TLI.InterfaceInfoFromObject(objDest)

   

    lngCnt = 0

 

    ‘ 对读出的信息进行遍历

For Each objProp In objTypeLib.Members

‘ 过滤 , 每一个接口都属于特定的调用类型

‘ 这里为只Print该对象的Property Get类型的接口

If objProp.InvokeKind = INVOKE_PROPERTYGET Then

       ‘ objProp.Name 就是这个接口的名字

       ‘ 它可以返回给上面的CallByName , 当然这并不是唯一目的

        Debug.Print lngCnt & "  " & objProp.Name

          End If

        lngCnt = lngCnt + 1

    Next

 

    Exit Function

 

Error_Handler:

    

End Function

 

 

     上面的三个函数和一个DLL , 可以在后绑定模式对象的使用上为我们提供很多帮助 , 加上用心的分析和设计 , 相信可以解决这一范围内的大多问题。

本文地址:http://com.8s8s.com/it/it42404.htm