我知道不可能获取密钥(如何从集合 VB.Net 中获取密钥和值),最好使用其他类。但是我正在调试 10 年前的代码,我无法更改它。
在监视窗口中,我看到:
所以似乎可以将集合处理为“ List(of KeyValuePair)
”。我可以用代码来做,还是只是内部翻译。
我基本上需要列出集合中的所有键。
我知道不可能获取密钥(如何从集合 VB.Net 中获取密钥和值),最好使用其他类。但是我正在调试 10 年前的代码,我无法更改它。
在监视窗口中,我看到:
所以似乎可以将集合处理为“ List(of KeyValuePair)
”。我可以用代码来做,还是只是内部翻译。
我基本上需要列出集合中的所有键。
VisualBasic.Collection
有一个未记录的私有方法InternalItemsList
,它允许读取除了值之外的键。InternalItemsList
is的类型 Microsoft.VisualBasic.Collection.FastList
似乎不是 Enumerable 但有一个方法Item
可以返回从零开始的索引的项目。这些项目的类型是Microsoft.VisualBasic.Collection.Node
。一个项目有两个私有属性m_Value
和m_Key
. 我们在这里。
以下代码说明了如何转换VisualBasic.Collection
为List(Of KeyValuePair
.
Dim flg As BindingFlags = BindingFlags.Instance Or BindingFlags.NonPublic
Dim InternalList As Object = col.GetType.GetMethod("InternalItemsList", flg).Invoke(col, Nothing)
Dim res As New List(Of KeyValuePair(Of String, Object))
For qq As Integer = 0 To col.Count - 1
Dim Item As Object = InternalList.GetType.GetProperty("Item", flg).GetValue(InternalList, {qq})
Dim Key As String = Item.GetType.GetField("m_Key", flg).GetValue(Item)
Dim Value As Object = Item.GetType.GetField("m_Value", flg).GetValue(Item)
res.Add(New KeyValuePair(Of String, Object)(Key, Value))
Next
我知道使用未记录的函数并不安全,但它仅供内部使用,也是我设法找到的唯一解决方案。