2008-10-08 32 views
35

Tôi đã được đẩy vào khung .NET trong PowerShell và tôi đã đạt được thứ gì đó mà tôi không hiểu. Đây hoạt động tốt:Bộ sưu tập chung của PowerShell

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

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

Tuy nhiên điều này không:

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

Cả hai đều trong cùng một assembly, vì vậy những gì tôi bị mất?

Như đã được chỉ ra trong câu trả lời, đây chỉ là vấn đề khá lớn với PowerShell v1.

Trả lời

17

Từ điển < K, V> không được định nghĩa trong cùng một cụm từ như SortedDictionary < K, V>. Một là trong mscorlib và cái kia trong system.dll.

Trong đó có vấn đề. Hành vi hiện tại trong PowerShell là khi giải quyết các tham số chung được chỉ định, nếu các kiểu không phải là tên kiểu hoàn toàn đủ điều kiện, nó giả định rằng chúng nằm trong cùng một assembly như kiểu generic bạn đang cố gắng để khởi tạo.

Trong trường hợp này, điều đó có nghĩa là nó đang tìm System.String trong System.dll, chứ không phải trong mscorlib, do đó, nó không thành công.

Giải pháp là chỉ định tên lắp ráp đủ điều kiện cho các loại thông số chung. Đó là cực kỳ xấu xí, nhưng hoạt động:

$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

Có tham chiếu nào mô tả cú pháp này không? Tôi đang cố gắng để thực hiện BeginInvoke từ một đối tượng Powershell và có một heck của một thời gian với việc sử dụng các thông số đầu vào và đầu ra trong một trong những quá tải cho nó. Tôi dường như không thể tuyên bố đúng. –

4

Có một số vấn đề với Generics trong PowerShell. Lee Holmes, một nhà phát triển trong nhóm PowerShell đã đăng this script để tạo Generics.

+2

[cache link] (https://web.archive.org/web/20090926122811 /http://www.leeholmes.com/blog/CreatingGenericTypesInPowerShell.aspx) – user2426679

+1

Có phải "tối nay" chưa? :) – mklement0

78

Trong PowerShell 2.0 cách mới để tạo ra một Dictionary là:

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

+1 Câu trả lời tốt hơn nhiều – galaktor

+7

Đúng là câu trả lời tốt hơn nhiều. ** Nếu ** người dùng ở trên v2. Câu hỏi đã được hỏi liên quan đến v1 mặc dù. Vẫn còn một số lượng lớn người trên thế giới đang trên v1. – EBGreen

+0

Rõ ràng, bạn sẽ có cùng một vấn đề trong v2 nếu một trong các loại được khai báo trong một hội đồng bên thứ 3: http://stackoverflow.com/questions/11975130. Điều này dường như được sửa trong v4 – marsze

Các vấn đề liên quan