在.Net COM中使IEnumerable有意义Interop
问题描述:
为什么我可以使用VBScript for each
语句迭代System.Collections.ArrayList
对象,但不是Systems.Collections.SortedList
对象?在.Net COM中使IEnumerable有意义Interop
假定下列:
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
。我只是问为什么IEnumrable
似乎没有在互操作版本SortedList
中实现,当它在ArrayList
的互操作版本中实现时。
答
虽然SortedList确实实现了IEnumerable,但它有一个重载的GetEnumerator()方法,该方法返回IDictionaryEnumerator。您必须明确地将其转换为IEnumerable才能使用返回IEnumerator的重载,这可能是您的问题所在。
默认的枚举器不具有与ArrayList相同的行为 - 它将为每个项目返回一个DictionaryEntry,而不是您可能期望的字符串。
我的猜测是,你可能想使用values属性,并且,如果你用数字排序,您要使用Add方法参数的其他方式即
sList.Add 1, "a"