理解.Net COM Interop中的IEnumerable

时间:2012-02-28 17:09:23

标签: .net ienumerable com-interop

为什么我可以使用VBScript for each语句来迭代System.Collections.ArrayList对象,而不是Systems.Collections.SortedList对象?

鉴于以下内容:

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

该行

for each item in sList

崩溃
  

对象不支持此属性或方法*。

通过此属性我假设它们是_NewEnum属性。但是_NewEnum为什么会ArrayList而不是SortedList?这两个类都实现了IEnumberable接口,反汇编mscorelib.dll似乎是负责实现_NewEnum属性(dispId -4)的接口。

如果有人能够对这些类似课程的不同COM互操作行为有所了解,我将非常感激。

我知道我可以使用SortedList公开的其他属性来迭代集合。我不是问如何迭代SortedList。我只是问为IEnumrableSortedList的互操作版本中实现ArrayList时,似乎没有实现{{1}}。

1 个答案:

答案 0 :(得分:3)

虽然SortedList确实实现了IEnumerable,但它有一个重载的GetEnumerator()方法,它返回IDictionaryEnumerator。您必须显式转换为IEnumerable以使用返回IEnumerator的重载,这可能是您的问题所在。

默认枚举器与ArrayList的行为不同 - 它将为每个项返回一个DictionaryEntry,而不是您可能期望的字符串。

我的猜测是你可能想要使用Values属性,如果你按数字排序,你想要反过来使用Add方法参数,即

sList.Add 1, "a"