C# 字典KeyNotFoundException,即使键存在

C# 字典KeyNotFoundException,即使键存在,c#,.net,registry,C#,.net,Registry,我有一个注册表项作为字典的键 我似乎无法为该特定键设置值。无论我做什么,我总是得到一个KeyNotFoundException。密钥确实存在,我在前面一行创建了它 e、 g: public Dictionary subKeyNodes=新建。。。 添加(mainKeyNode.CreateSubKey(keyName),newdictionary()); subKeyNodes[mainkynode.CreateSubKey(keyName)]。添加(“ROAR”、“value”); Add工

我有一个
注册表项作为字典的键

我似乎无法为该特定键设置值。无论我做什么,我总是得到一个
KeyNotFoundException
。密钥确实存在,我在前面一行创建了它

e、 g:

public Dictionary subKeyNodes=新建。。。
添加(mainKeyNode.CreateSubKey(keyName),newdictionary());
subKeyNodes[mainkynode.CreateSubKey(keyName)]。添加(“ROAR”、“value”);

Add工作正常。添加该键值总是失败的,我似乎无法解决它。

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

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


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

更好的方法是向字典的构造函数提供实现
IEqualityComparer
的东西-这样,您就不需要包装每个对象。

这是一个示例,我试过了,结果也一样。CreateSubKey应该/应该返回key,否则这将是我的第一个问题。仅仅因为它打开同一个注册表项并不意味着它是同一个对象实例。您是否考虑过使用key.Name作为键而不是key对象?是,我以前试图避免它,以便在需要时可以引用完整的注册表项,但由于我遇到了这个问题,我完全忘记了它。不过,我将坚持使用包装器,这样我就可以轻松地引用RegistryKey,而不是每次都检索它。谢谢+1@RezaM. 请记住,注册表项是一次性对象,因此为了清楚地了解您的实现,每个CreateSubKey都应该由Close和/或Dispose匹配。如果以后要使用相同的符号,那么在将它们放入字典时,您可能不想关闭这些键。因此,你必须循环浏览字典中的每一个键并关闭它。谢谢@Paul,我会试试这个并让你知道。顺便说一句,没有办法在类中强制实现GetHashCode或Equals?我在想一些类似Extensions.wow的东西,它是密封的——我讨厌被迫封装
public Dictionary<RegistryKey, Dictionary<string, object>> subKeyNodes = new...
subKeyNodes.Add(mainKeyNode.CreateSubKey(keyName),new Dictionary<string, object>());
subKeyNodes[mainKeyNode.CreateSubKey(keyName)].Add("ROAR", "value");