collections - 如何检查对象是否为集合

标签 collections vbscript

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

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 , EmptyCollection ?

我认为最好尝试枚举 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/

相关文章:

c# - 如何在 C# 中获取 string[] 数组的一部分

java - 更重要的是 "expensive": Creating a too big ArrayList or upsizing an ArrayList?

c# - 无法使用集合初始值设定项实现类型 XYZ,因为它不实现 'System.Collections.IEnumerable'

javascript - VBScript chr() 似乎返回错误值

VBScript 执行不适用于变量,但适用于字符串

windows - 如何从 .vbs 文件创建 Windows 服务?

windows - 如何检索 LAN 适配器 MAC 地址?

java.lang.ClassCastException : java. util.HashMap$EntrySet 无法转换为 java.util.HashSet

vbscript - QTP/UFT Capturebitmap 直接保存到 Quality Center (QC)

javascript - 如何在具有范围的集合之间快速分配值