如何检查一个对象是否为集合

6

我在我的一个脚本中一直收到这个错误:

对象不是集合

因此,我想创建一个函数,在对其执行任何操作之前检查对象是否为集合。

到目前为止,我已经创建了以下内容:

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 

即使在第二个例子中,指定错误是否为“对象不是集合”会更明智吗?
1个回答

3
VBScript不支持类型内省。你可以检查paramTypeName,但是你需要一个实现可枚举接口的所有类的权威列表。
我认为你最好的选择确实是尝试枚举param并检查是否出现运行时错误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)

2
这将数组归类为集合。从技术上讲,它们确实是集合,但仍然令人意外。我会修改最后一行为 IsCollection = Not IsArray(param) - Tomalak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接