我现在正在处理有关注册表的一些事情。
我查看了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不返回真正的键值?
答案 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)
请注意,ReadKey
和ExecuteKey
都定义了相同的值,等于131097
。
ExecuteKey = 131097,
ReadKey = 131097,
技术上两者都是平等的。