Collezioni generiche di PowerShell
-
06-07-2019 - |
Domanda
Sto spingendo nel framework .NET in PowerShell e ho colpito qualcosa che non capisco. Funziona bene:
$foo = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]"
$foo.Add("FOO", "BAR")
$foo
Key Value
--- -----
FOO BAR
Questo tuttavia non:
$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]"
Sono entrambi nello stesso assieme, quindi cosa mi sto perdendo?
Come è stato sottolineato nelle risposte, questo è praticamente solo un problema con PowerShell v1.
Soluzione
dizionario < K, V > non è definito nello stesso assembly di SortedDictionary < K, V > ;. Uno è in mscorlib e l'altro in system.dll.
Qui sta il problema. Il comportamento attuale in PowerShell è che quando si risolvono i parametri generici specificati, se i tipi non sono nomi di tipo pienamente qualificati, si presume che si trovino nello stesso assembly del tipo generico che si sta tentando di creare un'istanza.
In questo caso, significa che cerca System.String in System.dll e non in mscorlib, quindi non riesce.
La soluzione è specificare il nome dell'assembly completo per i tipi di parametri generici. È estremamente brutto, ma funziona:
$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]]"
Altri suggerimenti
In PowerShell 2.0 il nuovo modo di creare un Dizionario
è:
$object = New-Object 'system.collections.generic.dictionary[string,int]'
Ci sono alcuni problemi con Generics in PowerShell. Lee Holmes, uno sviluppatore del team PowerShell ha pubblicato questo script per creare Generics.