2

我需要将 VB 集合转换为现代集合,例如 Dictionary 或 Hashtable。对于我的方法,我需要 Collection 的 KEYS。谷歌搜索告诉我这是不可能的。

使用新集合重写整个应用程序不是一种选择,因为该应用程序确实又旧又大(从 VB6 转换为 VB.Net)。使用旧的 Collection 也不好——因为有新的组件正在开发中。

将 - 例如 - Hashtable 转换为 Collection 工作:

 using VBCollection = Microsoft.VisualBasic.Collection;
 public static VBCollection ToVBCollection(this Hashtable table)
    {
        var collection = new VBCollection();
        foreach (DictionaryEntry  pair in table)
        {
            collection.Add(pair.Value, pair.Key as string);
        }
        return collection;
    }

转换 VBCollection 不会,因为我不知道如何检索密钥:

 using VBCollection = Microsoft.VisualBasic.Collection;
  public static Hashtable ToHashtable(this VBCollection Collection)
    {
        var table = new Hashtable();

        foreach (var pair in Collection)
        {
            table.Add(pair.Key, pair.Value); //I need the key and the corresponding value
        }
        return table;
    }

有什么建议吗?如果确实不可能检索密钥(谢谢,Microsoft),那么我应该如何将 VB COllection 转换为现代的东西?

提前致谢

4

1 回答 1

0

如果要求对现有代码库的影响尽可能小,我会为 Collection 编写一个替代品。编写自己的类会很容易(如果不是有点乏味的话),该类公开所有与 VB 集合相同的方法,但还包括返回键的其他方法。您可以从一些内置的 .NET 集合类型继承,也可以只使用 compisition 来包装 Hashtable。然后,您可以在转换后的 VB.NET 应用程序中更改 Imports 子句,以包含 Microsoft.VisualBasic.Collection 的 Collection intsead。


无论如何,我将发布一个替代但更复杂的解决方案。您可以使用反射来获取 VB 集合对象在内部使用的私有字典。有了它,您可以迭代密钥。这比其他方法更像是一种 hack,但应该同样有效。一个警告是,如果 MS 更改类的内部结构,访问类的私有成员很容易被破坏。

于 2012-06-26T12:52:24.110 回答