5

我现在正在研究有关注册表的一些东西。

我检查了枚举RegistryRightsSystem.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 不返回真正的键值?

4

2 回答 2

4

我认为您必须遍历枚举名称而不是值。就像是:

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

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

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

于 2013-09-01T12:57:31.903 回答
3

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

ExecuteKey = 131097,
ReadKey = 131097,

所以从技术上讲,两者都是平等的。

于 2013-09-01T12:58:16.177 回答