Общие коллекции PowerShell
Я вставлял .NET Framework в 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.
Ответы
Ответ 1
Словарь < K, V > не определен в той же сборке, что и SortedDictionary < K, V > . Один из них находится в mscorlib, а другой - в system.dll.
В этом и заключается проблема. Текущее поведение в PowerShell заключается в том, что при разрешении указанных общих параметров, если типы не являются полностью квалифицированными именами типов, это предполагает, что они находятся в той же сборке, что и общий тип, который вы пытаетесь создать.
В этом случае это означает, что он ищет System.String в System.dll, а не в 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]]"
Ответ 2
В PowerShell 2.0 новый способ создания Dictionary
:
$object = New-Object 'system.collections.generic.dictionary[string,int]'
Ответ 3
Есть некоторые проблемы с Generics в PowerShell. Ли Холмс, разработчик PowerShell, опубликовал этот script для создания Generics.