2010-03-09 9 views
12

Tengo una enumeración marcado con el atributo [Banderas] de la siguiente manera:¿Cómo puedo determinar si un valor de Enum tiene uno o más de los valores con los que se compara?

[Flags] 
public enum Tag : int 
{ 
    None = 0, 
    PrimaryNav = 1, 
    HideChildPages = 2, 
    HomePage = 4, 
    FooterLink = 8 
} 

En sitemapnodes en mi mapa del sitio almaceno el valor int para la combinación de etiquetas como un atributo.

Lo que necesito hacer es comprobar si un nodo tiene cualquier de una o más etiquetas, por ejemplo, Tag.PrimaryNav | Tag.HomePage.

Estoy luchando con la lógica booleana necesaria para determinar si un valor de Enum tiene uno o más de los valores con los que se compara.

Disculpa si esto no está claro. Puedo proporcionar más información si es necesario.

Respuesta

26

puede hacerlo mediante la combinación de los valores con | y comprobar a través de &.

para comprobar si el valor contiene cualquiera de las etiquetas:

if ((myValue & (Tag.PrimaryNav | Tag.HomePage)) != 0) { ... } 

El | combina las enumeraciones que estés pruebas (bit a bit) y las pruebas a través de enmascaramiento & bit a bit - si el resultado ISN' t cero, tiene al menos uno de ellos configurado.

Si desea probar si tiene tanto de ellos SET, puede hacerlo así:

Tag desiredValue = Tag.PrimaryNav | Tag.HomePage; 
if ((myValue & desiredValue) == desiredValue) { ... } 

Aquí estamos el enmascaramiento de cualquier cosa que no se preocupan, y las pruebas que el valor resultante es igual a lo que importa (no podemos usar != 0 como antes porque eso coincidiría con el valor y aquí estamos interesados ​​en ambos).

Algunos enlaces:

+0

Gran respuesta, muchas gracias :) –

1
var someEnumValue = Tag.PrimaryNav | Tag.HomePage; 

Para probar si la enumeración contiene un valor dado:

if ((someEnumValue & Tag.PrimaryNav) == Tag.PrimaryNav) 
{ 

} 
1
var tag = Tag.HideChildPages | Tag.PrimaryNav; 

If ((tag & Tag.PrimaryNav) == Tag.PrimaryNav) { 
    // Tag.PrimaryNav set. 
} 
2

Para bit a bit (Flags) enumeraciones, una "cualquiera de" prueba es!= 0, por lo que:

const Tag flagsToLookFor = Tag.PrimaryNav | Tag.HomePage; 
if ((node.Tag & flagsToLookFor) != 0) { 
    // has some cross-over with PrimaryNav or HomePage (and possibly others too) 
} 
+0

Del mismo modo, esto hizo el truco - gracias Marc. –

9

Usted puede utilizar el método HasFlag para evitar la necesidad de la lógica booleana,

Tag Val = (Tag)9; 

if (Val.HasFlag(Tag.PrimaryNav)) 
{ 
    Console.WriteLine("Primary Nav"); 
} 

if(Val.HasFlag(Tag.HomePage)) 
{ 
    Console.WriteLine("Home Page"); 
} 
+1

Este método es nuevo en .NET 4.0, por lo que no funcionará si el OP está utilizando una versión anterior ... –

+0

sí, y luego utilice cualquiera de los otros métodos de la lista que solo quería lanzar allí. – rerun

+0

+1 Un muy buen punto. –

1

Usted podría utilizar Unconstrained Melody biblioteca de Jon Skeet:

var someEnumValue = Tag.PrimaryNav | Tag.HideChildPages; 
someEnumValue.HasAny(Tag.PrimaryNav | Tag.HomePage); // Returns true 
0

Usted puede usar este método de extensión en enumeración, para cualquier tipo de enumeraciones:

public static bool IsSingle(this Enum value) 
    { 
     var items = Enum.GetValues(value.GetType()); 
     var counter = 0; 
     foreach (var item in items) 
     { 
      if (value.HasFlag((Enum)item)) 
      { 
       counter++; 
      } 
      if (counter > 1) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 
Cuestiones relacionadas