System.Collections.ArrayList成为System.Collecitons.HashTable

时间:2017-09-07 21:51:27

标签: powershell arraylist collections hashtable

任何人都可以解释这种奇怪的PowerShell行为。

如果我宣布以下内容:

$MyCollection = New-Object System.Collections.ArrayList

$MyCollection.Add(@{'Val1'=1; 'Val2'=2; 'Val3'=3})
$MyCollection.Add(@{'Val1'=1; 'Val2'=2; 'Val3'=3})
$MyCollection.Add(@{'Val1'=1; 'Val2'=2; 'Val3'=3})

所以...我应该有一个看起来像这样的对象:

System.Collections.Array.List
Index Item
0     {System.Collections.HashTable}
1     {System.Collections.HashTable}
2     {System.Collections.HashTable}

但是,如果我成为会员,您会看到我的整个收藏品已成为一个大型哈希表

$MyCollection | Get-Member

 TypeName: System.Collections.Hashtable

Name              MemberType            Definition                                                                                                                                                                         
----              ----------            ----------                                                                                                                                                                         
Add               Method                void Add(System.Object key, System.Object value), void IDictionary.Add(System.Object key, System.Object value)                                                                     
Clear             Method                void Clear(), void IDictionary.Clear()                                                                                                                                             
Clone             Method                System.Object Clone(), System.Object ICloneable.Clone()                                                                                                                            
Contains          Method                bool Contains(System.Object key), bool IDictionary.Contains(System.Object key)                                                                                                     
ContainsKey       Method                bool ContainsKey(System.Object key)                                                                                                                                                
ContainsValue     Method                bool ContainsValue(System.Object value)                                                                                                                                            
CopyTo            Method                void CopyTo(array array, int arrayIndex), void ICollection.CopyTo(array array, int index)                                                                                          
Equals            Method                bool Equals(System.Object obj)                                                                                                                                                     
GetEnumerator     Method                System.Collections.IDictionaryEnumerator GetEnumerator(), System.Collections.IDictionaryEnumerator IDictionary.GetEnumerator(), System.Collections.IEnumerator IEnumerable.GetEn...
GetHashCode       Method                int GetHashCode()                                                                                                                                                                  
GetObjectData     Method                void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context), void ISerializable.GetObjectData(System.Runtime....
GetType           Method                type GetType()                                                                                                                                                                     
OnDeserialization Method                void OnDeserialization(System.Object sender), void IDeserializationCallback.OnDeserialization(System.Object sender)                                                                
Remove            Method                void Remove(System.Object key), void IDictionary.Remove(System.Object key)                                                                                                         
ToString          Method                string ToString()                                                                                                                                                                  
Item              ParameterizedProperty System.Object Item(System.Object key) {get;set;}                                                                                                                                   
Count             Property              int Count {get;}                                                                                                                                                                   
IsFixedSize       Property              bool IsFixedSize {get;}                                                                                                                                                            
IsReadOnly        Property              bool IsReadOnly {get;}                                                                                                                                                             
IsSynchronized    Property              bool IsSynchronized {get;}                                                                                                                                                         
Keys              Property              System.Collections.ICollection Keys {get;}                                                                                                                                         
SyncRoot          Property              System.Object SyncRoot {get;}                                                                                                                                                      
Values            Property              System.Collections.ICollection Values {get;}

行为就像这样。例如,我无法以我想要的方式访问我的对象:

$MyCollection | %{$_.Val1} 

输出

1
1
1

预期输出

1

正如您所看到的,我们现在有一个大型哈希表,其行为非常奇怪。任何人都可以解释Powershell实际上在做什么吗?因为它肯定没有访问ArrayList集合中的HashTable。

就像调用任何cmdlet一样,将我的数据结构展平为一个哈希表

1 个答案:

答案 0 :(得分:4)

当您通过管道传递数组时,它会被展开,因此在您的示例中Get-Member会看到数组的内部,哈希表。

要获取作为数组的对象的类型,可以使用GetType()方法并查看name属性。

$MyCollection.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     ArrayList                                System.Object

Ansgar Wiechers在下面显示您还可以使用-InputObject参数来获取数组的类型。

Get-Member -InputObject $MyCollection

如果您只想要哈希表输出数组中的单个项目,那么您需要指定数组中的哪个索引,您希望该值跟随哈希表键。

$MyCollection[0]['Val1']
1

上面的示例返回存储在数组中第一个对象的键Val1中的值。要获得其他人,您必须增加索引号或更改密钥。