理解.Net COM Interop中的IEnumerable
为什么可以使用VBScript for each
语句来迭代System.Collections.ArrayList
oject,但不是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
。 我只是问,为什么在互操作版本的ArrayList
实现时, IEnumrable
似乎没有在SortedList
的互操作版本中实现。
尽管SortedList确实实现了IEnumerable,但它有一个重载的GetEnumerator()方法,该方法返回IDictionaryEnumerator。 您必须明确地将其转换为IEnumerable才能使用返回IEnumerator的重载,这可能是您的问题所在。
默认枚举器不具有与ArrayList相同的行为 - 它将为每个项目返回一个DictionaryEntry,而不是您可能期望的字符串。
我的猜测是你可能想要使用Values属性,而如果你按照数字排序,你想用另一种方法使用Add方法参数
sList.Add 1, "a"
链接地址: http://www.djcxy.com/p/10495.html
上一篇: Making sense of IEnumerable in .Net COM Interop
下一篇: DirectoryIterator::getBasename vs DirectoryIterator::getFilename