2012-02-28 32 views
7

Tại sao tôi có thể sử dụng câu lệnh VBScript for each để lặp lại một đề mục System.Collections.ArrayList, nhưng không phải là đối tượng Systems.Collections.SortedList?Làm cho cảm giác của IEnumerable trong .Net COM Interop

Do sau:

set aList = Server.CreateObject("System.Collections.ArrayList") 
aList.Add "a" 
aList.Add "b" 
aList.Add "c" 
for each item in aList 
    ' do something 
next 

set sList = Server.CreateObject("System.Collections.SortedList") 
sList.Add "a", 1 
sList.Add "b", 2 
sList.Add "c", 3 
for each item in sList 
    ' do something 
next 

Dòng

for each item in sList 

tai nạn với

đối tượng không hỗ trợ tài sản hoặc phương pháp *.

Bằng cách thuộc tính này Tôi giả sử chúng có nghĩa là tài sản _NewEnum. Nhưng tại sao _NewEnum bị hiển thị bởi ArrayList, nhưng không phải là SortedList? Cả hai lớp thực hiện giao diện IEnumberable mà từ việc tháo rời mscorelib.dll dường như là giao diện chịu trách nhiệm thực hiện thuộc tính _NewEnum (dispId of -4).

Nếu bất kỳ ai cũng có thể làm sáng tỏ về hành vi tương tác COM khác nhau của các lớp tương tự này, tôi sẽ rất đánh giá cao.

Tôi biết tôi có thể sử dụng các thuộc tính khác được hiển thị bởi SortedList để lặp qua bộ sưu tập. Tôi không hỏi cách lặp lại một số SortedList. Tôi chỉ hỏi tại sao IEnumrable dường như không được thực hiện trong phiên bản interop của SortedList khi nó được thực hiện trong phiên bản interop của ArrayList.

Trả lời

3

Mặc dù SortedList thực hiện IEnumerable nó có phương thức GetEnumerator() quá tải trả về IDictionaryEnumerator. Bạn phải đúc một cách rõ ràng với IEnumerable để sử dụng quá tải mà trả về IEnumerator mà có thể là nơi mà vấn đề của bạn nằm.

Điều tra mặc định không có hành vi tương tự như của ArrayList - nó sẽ trả về một DictionaryEntry cho mỗi mục chứ không phải là chuỗi bạn có thể mong đợi.

Tôi đoán sẽ có thể bạn muốn sử dụng các giá trị tài sản để thay thế và rằng, nếu bạn đang sắp xếp theo các con số, bạn muốn sử dụng các đối số phương thức Add cách khác xung quanh ví dụ:

sList.Add 1, "a" 
Các vấn đề liên quan