2012-03-22 91 views
2

我有一个RegistryKey作为我的字典的关键。字典KeyNotFoundException即使密钥存在

我似乎无法为该特定的密钥设置一个值。无论我做什么,我都会收到KeyNotFoundException。关键确实存在,我创造了它早一行

e.g:

public Dictionary<RegistryKey, Dictionary<string, object>> subKeyNodes = new... 
subKeyNodes.Add(mainKeyNode.CreateSubKey(keyName),new Dictionary<string, object>()); 
subKeyNodes[mainKeyNode.CreateSubKey(keyName)].Add("ROAR", "value"); 

的添加工作正常。添加该键值总是失败,我似乎无法弄清楚。

回答

2

RegistryKey既没有GetHashCode也没有Equals覆盖。这意味着RegistryKey的实例将使用默认实现(在Object中定义)。由于这两个RegistryKey的实例不会被识别为“平等”,即使它们的字段相同。这意味着您不能将此类的实例用作基于哈希的集合的键,如DictionaryHashSet

作为一种解决方法,您可以定义另一个包装RegistryKey并定义这些方法覆盖的类。

+0

谢谢@保罗,我会试试这个,让你知道。顺便说一句,现在实施GetHashCode或Equals强制进入课堂?我在想像扩展。 – 2012-03-22 17:53:21

+0

哇,它是密封的 - 我讨厌当我被迫封装 – payo 2012-03-22 18:45:24

1

CreateSubKey大概会在您每次调用它时返回一个新的对象实例。因此,调用它两次会给你不同的对象(即使它们可能引用相同的注册表项)。您应该将第一次调用的结果存储到CreateSubKey,而不是再次调用它。或者使用键名而不是对象作为字典的键。

+0

这是一个例子,我试着用相同的结果。而且,如果CreateSubKey存在,那么它应该返回密钥,否则那将是我的第一个问题。 – 2012-03-22 17:50:28

+0

仅仅因为它打开相同的注册表项并不意味着它是同一个对象实例。 – BlueMonkMN 2012-03-22 17:56:14

+0

您是否考虑过使用Key.Name作为您的密钥而不是密钥对象? – BlueMonkMN 2012-03-22 18:00:45

4

一个更好的方法是提供一些实现IEqualityComparer<RegistryKey>到Dictionary的构造函数 - 这样,你不需要包装每个对象。

+0

甜,下次会记住这一点。 – 2012-03-22 20:05:03