powershell 如何测试一个对象是否是任何类型的数组或列表?

kqhtkvqz  于 2023-11-18  发布在  Shell
关注(0)|答案(1)|浏览(151)

我想测试一个对象是否是一个字符串或任何类型的数组或列表(不是哈希表或字典等)似乎不可能测试. NET中的每一种类型的集合。
我试过这样的东西:

($list -is [Collections.IEnumerable]) -and ($list -isnot [Collections.IDictionary])

字符串
但堆栈或队列在该测试中将返回true。

kmbjn2e3

kmbjn2e31#

从技术上讲,hashtable和其他字典类型都是集合。QueueStack也是集合,它们实现了ICollection interafce
在这种情况下,如果我理解正确的话,你可以定位的接口是IListarrayArrayListList<T>和其他 * 集合类型 * 都有这个接口:

$instancesToTest = (
    @(),
    @{},
    [ordered]@{},
    [System.Collections.ObjectModel.Collection[string]]::new(),
    [System.Management.Automation.PSDataCollection[string]]::new(),
    [System.Collections.Generic.List[string]]::new(),
    [System.Collections.Generic.Dictionary[string, string]]::new(),
    [System.Collections.Generic.Queue[string]]::new(),
    [System.Collections.Generic.Stack[string]]::new(),
    [System.Collections.Stack]::new(),
    [System.Collections.Queue]::new(),
    [System.Collections.ArrayList]::new()
)

$instancesToTest | ForEach-Object {
    [pscustomobject]@{
        Type    = $_.GetType()
        IsIList = $_ -is [System.Collections.IList]
    }
} | Sort-Object IsIList -Descending

字符串
还有一个很棒的模块,叫做ClassExplorer,可以用来查找实现这个接口的所有类型:

Find-Type -ImplementsInterface System.Collections.IList

相关问题