2008-10-08 70 views
35

我一直在推入PowerShell中的.NET框架,並且碰到了一些我不明白的東西。這工作得很好:PowerShell通用集合

$foo = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]" 
$foo.Add("FOO", "BAR") 
$foo 

Key               Value 
---               ----- 
FOO               BAR 

然而,這並不:

$bar = New-Object "System.Collections.Generic.SortedDictionary``2[System.String,System.String]" 
New-Object : Cannot find type [System.Collections.Generic.SortedDictionary`2[System.String,System.String]]: make sure t 
he assembly containing this type is loaded. 
At line:1 char:18 
+ $bar = New-Object <<<< "System.Collections.Generic.SortedDictionary``2[System.String,System.String]" 

他們都在同一程序,所以我錯過了什麼?

正如答案中指出的那樣,這幾乎只是PowerShell v1的一個問題。

回答

17

詞典< K,V>沒有在與SortedDictionary < K,V>相同的程序集中定義。一個在mscorlib中,另一個在system.dll中。

存在這個問題。 PowerShell中的當前行爲是,當解析指定的泛型參數時,如果這些類型不是完全限定的類型名稱,它就會假設它們與您試圖實例化的泛型類型在同一個程序集中。

在這種情況下,這意味着它在System.dll中尋找System.String,而不是在mscorlib中,因此失敗。

解決方案是爲泛型參數類型指定完全限定的程序集名稱。這是非常難看,但工作原理:

$bar = new-object "System.Collections.Generic.Dictionary``2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" 
+0

有沒有任何描述這種語法的參考?我試圖從Powershell對象實現BeginInvoke,並在其中的一個重載中使用輸入和輸出參數。我似乎無法得到正確的聲明。 – 2012-06-13 18:05:57

4

在PowerShell中泛型存在一些問題。 Lee Holmes,PowerShell團隊的開發人員發佈了this script來創建泛型。

+2

[緩存鏈接](https://web.archive.org/web/20090926122811 /http://www.leeholmes.com/blog/CreatingGenericTypesInPowerShell.aspx) – user2426679 2016-02-02 22:30:52

+1

這是「今晚」嗎? :) – mklement0 2016-10-24 22:04:23

78

在PowerShell 2.0中新的方法來建立一個Dictionary是:

$object = New-Object 'system.collections.generic.dictionary[string,int]'