为什么迭代枚举返回重复键?

时间:2013-09-01 12:48:04

标签: c# enums registry

我现在正在处理有关注册表的一些事情。

我查看了RegistryRights中的枚举System.Security.AccessControl

public enum RegistryRights
{
    QueryValues = 1,
    SetValue = 2,
    CreateSubKey = 4,
    EnumerateSubKeys = 8,
    Notify = 16,
    CreateLink = 32,
    Delete = 65536,
    ReadPermissions = 131072,
    WriteKey = 131078,
    ExecuteKey = 131097,
    ReadKey = 131097,
    ChangePermissions = 262144,
    TakeOwnership = 524288,
    FullControl = 983103,
}

这个枚举是按位的,我知道枚举可以包含重复的值。 我试图通过这段代码迭代枚举:

 foreach (System.Security.AccessControl.RegistryRights regItem in Enum.GetValues(typeof(System.Security.AccessControl.RegistryRights)))
        {
            System.Diagnostics.Debug.WriteLine(regItem.ToString() + "  " + ((int)regItem).ToString());
        }

同样Enum.GetName(typeof(RegistryRights),regItem)返回相同的密钥名称。

我得到的输出是:


QueryValues  1
SetValue  2
CreateSubKey  4
EnumerateSubKeys  8
Notify  16
CreateLink  32
Delete  65536
ReadPermissions  131072
WriteKey  131078
ReadKey  131097
ReadKey  131097
ChangePermissions  262144
TakeOwnership  524288
FullControl  983103

有人可以告诉我为什么我能获得重复的密钥吗?(“ReadKey”而不是“ExecuteKey”) 如何可以强制它将int强制转换为值的第二个键? 为什么ToString不返回真正的键值?

2 个答案:

答案 0 :(得分:3)

我认为您必须遍历枚举名称而不是值。类似的东西:

foreach (string regItem in Enum.GetNames(typeof(RegistryRights)))
{
    var value = Enum.Parse(typeof(RegistryRights), regItem);

    System.Diagnostics.Debug.WriteLine(regItem + "  " + ((int)value).ToString());
}

至于为什么会发生这种情况,如果值重复,运行时无法知道返回哪个名称。这就是为什么迭代名称(保证是唯一的)会产生你正在寻找的结果。

答案 1 :(得分:3)

请注意,ReadKeyExecuteKey都定义了相同的值,等于131097

ExecuteKey = 131097,
ReadKey = 131097,

技术上两者都是平等的。