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
.
debería, vea el último ejemplo aquí http://msdn.microsoft.com/en-us/library/system.enum.hasflag.aspx
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.