name enum ejemplos define c# enums registry

ejemplos - enum string c#



¿Por qué iterar a través de la enum devolver claves duplicadas? (2)

Estoy trabajando ahora en algunas cosas con respecto al registro.

Comprobé el enum RegistryRights en 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, }

Esta enumeración es un bitwise, y sé que las enumeraciones pueden contener valores duplicados. Estaba tratando de iterar a través de la enumeración por este código:

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

también Enum.GetName (typeof (RegistryRights), regItem) devuelve el mismo nombre de clave.

y la salida que obtuve es:

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

¿Puede alguien decirme por qué obtengo claves duplicadas? ("ReadKey" en lugar de "ExecuteKey") ¿Cómo puedo forzarlo a convertir el int en la segunda clave del valor? y por qué ToString no devuelve el valor clave real?


Creo que tendrías que iterar sobre los Nombres enum en lugar de los valores. Algo como:

foreach (string regItem in Enum.GetNames(typeof(RegistryRights))) { var value = Enum.Parse(typeof(RegistryRights), regItem); System.Diagnostics.Debug.WriteLine(regItem + " " + ((int)value).ToString()); }

En cuanto a por qué sucede esto, no hay forma de que el tiempo de ejecución sepa qué nombre devolver si los valores están duplicados. Esta es la razón por la cual iterar a través de los nombres (que se garantiza que serán únicos) produce los resultados que está buscando.


Tenga en cuenta que ExecuteKey y ExecuteKey tienen los mismos valores definidos que es igual a 131097 .

ExecuteKey = 131097, ReadKey = 131097,

Entonces, técnicamente, ambos son iguales.