1

我知道不可能获取密钥(如何从集合 VB.Net 中获取密钥和值),最好使用其他类。但是我正在调试 10 年前的代码,我无法更改它。

在监视窗口中,我看到: 在此处输入图像描述

所以似乎可以将集合处理为“ List(of KeyValuePair)”。我可以用代码来做,还是只是内部翻译。

我基本上需要列出集合中的所有键。

4

1 回答 1

3

VisualBasic.Collection有一个未记录的私有方法InternalItemsList,它允许读取除了值之外的键。InternalItemsListis的类型 Microsoft.VisualBasic.Collection.FastList似乎不是 Enumerable 但有一个方法Item可以返回从零开始的索引的项目。这些项目的类型是Microsoft.VisualBasic.Collection.Node。一个项目有两个私有属性m_Valuem_Key. 我们在这里。

以下代码说明了如何转换VisualBasic.CollectionList(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

我知道使用未记录的函数并不安全,但它仅供内部使用,也是我设法找到的唯一解决方案。

于 2013-10-21T14:51:04.150 回答