values unity multiple español enum bitwise c# .net-4.0 enums enum-flags

c# - unity - Debería "o" funcionar con.Net4 Hasflags: enum.HasFlag(AccessRights.Read | AccessRights.Write)



enum multiple values c# (5)

Estoy probando las nuevas características HasFlags, y me preguntaba si lo siguiente debería funcionar:

enum.HasFlag (AccessRights.Read | AccessRights.Write)

... porque no parece ...

DBAccessRights rights = (DBAccessRights)permission.PermissionFlags; if (rights.HasFlag(DBAccessRights.WikiMode)) { // works } if (rights.HasFlag(DBAccessRights.WikiMode | DBAccessRights.CreateNew)) { // Doesn''t work } DBAccessRights flags = DBAccessRights.WikiMode | DBAccessRights.CreateNew; if (rights.HasFlag(flags)) { // Doesn''t work }


Dada la documentación , esperaría que sea verdadera si el valor tiene ambas banderas.

Si desea que pruebe si su valor tiene alguno de esos indicadores, necesitará

value.HasFlag(AccessRights.Read) | value.HasFlag(AccessRights.Write)

Si eso no es lo suficientemente legible para ti, es posible que desees consultar mi proyecto de Melodía no restringida . Sucede que ya tiene la funcionalidad que desea (como métodos de extensión en Flags.cs ):

// Same as value.HasFlag(AccessRights.Read | AccessRights.Write) value.HasAll(AccessRights.Read | AccessRights.Write) // Same as value.HasFlag(AccessRights.Read) | value.HasFlag(AccessRights.Write) value.HasAny(AccessRights.Read | AccessRights.Write)

Esos lo harían más claro, IMO. También evitarían el boxeo y serían inseguros :)


Desde MSDN :

El método HasFlag devuelve el resultado de la siguiente expresión booleana.

thisInstance y bandera = bandera

Para una bandera compleja como AccessRights.Read | AccessRights.Write AccessRights.Read | AccessRights.Write , esto verificará que estén todos los indicadores "contenidos".

Es probable que desee comprobar si alguno de los indicadores está presente, en cuyo caso puede:

myAccessRights & (AccessRights.Read | AccessRights.Write) != 0


El | el operador es en modo bit o. Significa que si Read es 1 y Write es 2, el valor Read | Write Read | Write es 3 (ver su representación binaria). Así que HasFlag devuelve verdadero solo si tu variable enum tiene ambos conjuntos de Read y Write .



Alternativamente, puedes invertir el orden de la expresión:

//returns true - a bit easier on the eye (AccessRights.Read | AccessRights.Write).HasFlag(myAccessRights)

Esto volverá verdadero si tiene Read | Acceso de escritura Eso sería funcionalmente equivalente a:

//also returns true - as per @Ani''s answer myAccessRights & (AccessRights.Read | AccessRights.Write) != 0

EDITAR

Como se señala en los comentarios, la primera expresión devolverá true si myAccessRights está vacío y false si myAccessRights tiene más que solo lectura y escritura.