我在我的一个脚本中不断收到此错误:
Object is Not a Collection
所以我想创建一个函数来检查对象是否是一个集合,然后再对其执行任何操作。
到目前为止,我已经创建了这个:
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
即使在第二个示例中,指定给出的错误是否是“对象不是集合”是否明智?
最佳答案
VBScript 并不真正支持类型自省(introspection)。您可以查看 TypeName
的 param
,但是您需要一个权威列表,其中包含实现可枚举接口(interface)的所有类。
我想说你最好的选择确实是尝试枚举 param
并检查您是否收到 runtime error 451 :
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)
关于collections - 如何检查对象是否为集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35864174/