我需要将 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)成员很容易被破坏。
