2016-03-08 16 views
5

continuo a ricevere questo errore in uno dei miei script:Come controllare se un oggetto è un insieme

scopo non è una raccolta

quindi vorrei creare una funzione che controlla se l'oggetto è o meno una raccolta prima di eseguire qualsiasi operazione su di esso.

Finora ho creato questo:

Function IsCollection(param) 
    If IsEmpty(param) Then 
     IsCollection = False 
    ElseIf(TypeName(param) = "String") Then 
     IsCollection = False 
    Else 
     IsCollection = True 
    End If 
End Function 

Ma ho la sensazione che mi manca alcuni controlli - sicuramente gli unici tipi disponibili non sono solo String, Empty o Collection?

Ho pensato che sarebbe stato meglio provare e enumerare param e se questo restituisce un errore, allora so di produrre false - sembra un'alternativa migliore?

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 

Anche nel secondo esempio, sarebbe saggio per specificare se l'errore è dato "oggetto non è una collezione"?

risposta

2

VBScript in realtà non supporta l'introspezione di tipo. È possibile controllare lo TypeName di param, ma in tal caso è necessario un elenco autorevole di tutte le classi che implementano un'interfaccia enumerabile.

direi che la cosa migliore è infatti quello di cercare in realtà di enumerare param e verificare se si ottiene un 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 

Assicuratevi di lasciare il campo di applicazione On Error Resume Next come localizzate possibile, preferibilmente lo usano appena dentro questa funzione