如何检查对象是否为集合

Bas*_*sie 6 collections vbscript

我在我的一个脚本中不断收到此错误:

对象不是集合

所以我想创建一个函数,在对象执行任何操作之前检查对象是否是一个集合.

到目前为止,我创建了这个:

Function IsCollection(param)
    If IsEmpty(param) Then
        IsCollection = False
    ElseIf(TypeName(param) = "String") Then
        IsCollection = False
    Else
        IsCollection = True
    End If
End Function 
Run Code Online (Sandbox Code Playgroud)

但我觉得我错过了一些检查 - 当然唯一可用的类型不仅仅是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 
Run Code Online (Sandbox Code Playgroud)

即使在第二个例子中,指定给出的错误是"对象不是集合"也是明智的吗?

Ans*_*ers 3

VBScript 并不真正支持类型自省。您可以检查TypeNameof param,但是您需要实现可枚举接口的所有类的权威列表。

我想说你最好的选择确实是尝试枚举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
Run Code Online (Sandbox Code Playgroud)

确保On Error Resume Next尽可能本地化范围,最好仅在该函数内使用它。


正如 Tomalak 在评论中提到的,上面的代码不仅会将“普通”集合报告为集合,还会报告 VBScript 内置数组(因为它们也是可枚举的)。为了避免这种情况改变线路

IsCollection = True
Run Code Online (Sandbox Code Playgroud)

IsCollection = Not IsArray(param)
Run Code Online (Sandbox Code Playgroud)

  • 这将数组分类为集合。从技术上来说,确实如此,但仍然出乎意料。我会将最后一行修改为“IsCollection = Not IsArray(param)”。 (2认同)