我一直在我的一个脚本中收到此错误:
对象不是集合
所以我想创建一个函数,在对象执行任何操作之前检查对象是否是一个集合。
到目前为止,我创造了这个:
Function IsCollection(param)
If IsEmpty(param) Then
IsCollection = False
ElseIf(TypeName(param) = "String") Then
IsCollection = False
Else
IsCollection = True
End If
End Function
但我觉得我错过了一些检查 - 当然唯一可用的类型不只是String
,Empty
或Collection
?
我认为尝试枚举param
可能会更好,如果这会返回错误,那么我知道输出false
- 这看起来是更好的选择吗?
Function IsCollection(param)
For Each p In param
' Anything need to go here?
Next
If Err > 0 Then
IsCollection = False
Else
IsCollection = True
End If
End Function
即使在第二个例子中,指定给定的错误是“对象不是集合”也是明智的吗?
答案 0 :(得分:3)
VBScript并不真正支持类型内省。您可以检查param
的{{3}},但是您需要一个实现可枚举接口的所有类的权威列表。
我认为你最好的选择是确实尝试枚举param
并检查你是否得到TypeName
:
Function IsCollection(param)
On Error Resume Next
For Each p In param
Exit For
Next
If Err Then
If Err.Number = 451 Then
IsCollection = False
Else
WScript.Echo "Unexpected error (0x" & Hex(Err.Number) & "): " & _
Err.Description
WScript.Quit 1
End If
Else
IsCollection = True
End If
End Function
确保尽可能将On Error Resume Next
的范围保留为本地化,最好在此功能中使用。
正如Tomalak在评论中提到的,上面不仅会报告“普通”集合作为集合,还会报告VBScript内置数组(因为它们也是可枚举的)。为了避免这种改变行
IsCollection = True
到
IsCollection = Not IsArray(param)