2008-10-08 7 views
35

He estado adentrándome en .NET Framework en PowerShell, y he llegado a algo que no entiendo. Esto funciona bien:Colecciones genéricas de PowerShell

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

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

Sin embargo, esto no lo hace:

$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]" 

Ambos están en el mismo conjunto, así que lo que me estoy perdiendo?

Como se señaló en las respuestas, esto es más o menos un problema con PowerShell v1.

Respuesta

17

Diccionario < K, V> no está definido en el mismo ensamblaje que SortedDictionary < K, V>. Uno está en mscorlib y el otro en system.dll.

Ahí radica el problema. El comportamiento actual de PowerShell es que, al resolver los parámetros genéricos especificados, si los tipos no son nombres de tipos completamente calificados, se supone que están en el mismo ensamblaje que el tipo genérico que está intentando crear.

En este caso, significa que está buscando System.String en System.dll, y no en mscorlib, por lo que falla.

La solución es especificar el nombre del ensamblaje totalmente calificado para los tipos de parámetros genéricos. Es muy feo, pero funciona:

$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

¿Hay alguna referencia que describa esta sintaxis? Estoy tratando de implementar BeginInvoke desde un objeto Powershell y estoy perdiendo el tiempo con el uso de los parámetros de entrada y salida en una de las sobrecargas para él. Parece que no puedo obtener la declaración correcta. –

4

Hay algunos problemas con los genéricos en PowerShell. Lee Holmes, un desarrollador del equipo de PowerShell publicó this script para crear genéricos.

+2

[vínculo en caché] (https://web.archive.org/web/20090926122811 /http://www.leeholmes.com/blog/CreatingGenericTypesInPowerShell.aspx) – user2426679

+1

¿Ya es "esta noche"? :) – mklement0

78

En PowerShell 2.0 la nueva manera de crear una Dictionary es:

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

+1 Respuesta mucho mejor – galaktor

+7

Es cierto que es una respuesta mucho mejor. ** Si ** el usuario está en v2. La pregunta fue hecha con respecto a v1 sin embargo. Todavía hay una gran cantidad de personas en el mundo que también están en v1. – EBGreen

+0

Obviamente, tendrá el mismo problema en v2 si uno de los tipos se declara en un ensamblado de un tercero: http://stackoverflow.com/questions/11975130. Esto parece estar arreglado en v4 – marsze

Cuestiones relacionadas