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.