2012-02-28 19 views
7

Dlaczego mogę użyć instrukcji VBScript for each do iterowania obiektu o numerze System.Collections.ArrayList, ale nie obiektu Systems.Collections.SortedList?Wyczuwanie IEnumerable w .Net COM Interop

Biorąc pod uwagę następujące elementy:

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 

Linia

for each item in sList 

wywala z

Obiekt nie obsługuje tej właściwości lub metody *.

Przez Ta nieruchomość Zakładam one oznaczają własność _NewEnum. Ale dlaczego _NewEnum jest naświetlone przez ArrayList, ale nie SortedList? Obie klasy implementują interfejs IEnumberable, który z deasemblowania mscorelib.dll wydaje się być interfejsem odpowiedzialnym za implementację właściwości _NewEnum (dispId z -4).

Jeśli ktokolwiek może rzucić trochę światła na różne zachowania międzyoperacyjne COM tych podobnych klas, byłbym bardzo wdzięczny.

Wiem, że mogę użyć innych właściwości narażonych przez SortedList do iteracji nad kolekcją. Nie pytam, jak wykonać iterację SortedList. Właśnie pytam, dlaczego IEnumrable nie wydaje się być zaimplementowane w wersji interopowej SortedList, gdy jest zaimplementowane w wersji interopowej ArrayList.

Odpowiedz

3

Chociaż SortedList implementuje IEnumerable ma przeciążoną metodę GetEnumerator(), która zwraca IDictionaryEnumerator. Musisz rzucić jednoznacznie na IEnumerable, aby użyć przeciążenia, które zwraca IEnumerator, na którym leży twój problem.

Domyślny moduł wyliczający nie zachowuje się tak samo jak ArrayList - zwróci obiekt DictionaryEntry dla każdego elementu, a nie dla łańcuchów, których można się spodziewać.

Moje przypuszczenie byłoby prawdopodobnie chcesz użyć właściwości Values ​​zamiast i że, jeśli sortowaniu według numerów chcesz użyć argumentów metody Add na odwrót tzn

sList.Add 1, "a"