后绑定方式下对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 , 可以在后绑定模式对象的使用上为我们提供很多帮助 , 加上用心的分析和设计 , 相信可以解决这一范围内的大多问题。