Skip to main content
 首页 » 编程设计

c#之VB Collection之转换为现代集合

2024年01月02日33虾米哥

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

使用新集合重写整个应用程序不是一种选择,因为该应用程序确实又旧又大(从 VB6 转换为 VB.Net)。 使用旧的 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 不会,因为我不知道如何检索 key :

 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; 
    } 

有什么建议吗?如果真的无法检索 key (感谢 Microsoft),那么我应该如何将 VB 集合转换为现代的东西?

提前致谢

请您参考如下方法:

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


不管怎样,我将发布一个替代但更复杂的解决方案。您可以使用 Reflection 获取 VB Collection 对象内部使用的私有(private) Dictionary。有了它,您可以迭代键。这比其他方法更像是一种 hack,但应该同样有效。需要注意的是,如果 MS 更改了类的内部结构,则访问类的私有(private)成员很容易被破坏。