.NET中如何检测对象是否为字符串、数组或任意列表类型?
解决方案
要精准检测对象是否为字符串、数组或列表类型(排除哈希表/字典、栈、队列等),可以通过以下组合条件实现:
$isTargetType = ($obj -is [string]) -or ($obj -is [array]) -or (($obj -is [System.Collections.IList]) -and ($obj -isnot [System.Collections.IDictionary]))
各条件说明
$obj -is [string]:直接匹配所有字符串实例$obj -is [array]:匹配任意.NET数组类型(如int[]、string[]等)($obj -is [System.Collections.IList]) -and ($obj -isnot [System.Collections.IDictionary]):匹配实现了IList接口的集合(如List<T>、ArrayList),同时排除字典类(尽管字典本身不实现IList,保留此判断可避免特殊场景下的误判)
原代码误判原因
原代码仅判断对象是IEnumerable且非IDictionary,但栈(Stack)、队列(Queue)同样实现了IEnumerable且不属于IDictionary,因此会被错误识别。而IList是列表类集合的核心标识接口,栈和队列并未实现该接口,以此过滤即可排除这类非目标集合。
测试验证
以下是几种典型对象的检测结果:
- 字符串
"hello"→ 返回True - 数组
@(1,2,3)→ 返回True - 泛型列表
[System.Collections.Generic.List[string]]@("a","b")→ 返回True - 栈
[System.Collections.Stack]::new()→ 返回False - 队列
[System.Collections.Queue]::new()→ 返回False - 字典
[System.Collections.Generic.Dictionary[string,int]]::new()→ 返回False
内容的提问来源于stack exchange,提问作者Vince Yuma
相关产品推荐
相关产品推荐

