2012-02-15 16 views
5

¿Cómo puedo agrupar los valores de Enum?
Supongamos que tengo una enumeración como¿Cómo se agrupan los valores de Enum?

public enum Colors 
    { 
    LightBlue, 
    LightGreen, 
    DarkGreen, 
    Black, 
    White, 
    LightGry, 
    Yellow 
    } 

Ahora quiero definir algunos grupos de colores, por ejemplo los colores claros (LightBlue, LightGreen, White, LightGray, Yellow) y los colores oscuros (Black, DarkGreen).
Entonces puedo pedir grupos en diferentes lugares de mi código.
Si recuerdo correctamente mi tiempo de Java, simplemente podría agregar métodos a las enumeraciones en Java. Creo que eso no es posible en C#. Pero tal vez hay otras formas.

Edit1: Por supuesto que puede añadir una clase de utilidad con el miembro estático como IsADarkColor(Colors c). Pero me gustaría hacerlo sin una clase adicional porque podría olvidar esa clase relacionada cuando necesito esa característica.

+1

C# no es Java, escribir clases (en Java, incluso una enumeración es un objeto). –

Respuesta

8

puedo añadir una clase de utilidad con el miembro estático como IsADarkColor(Colors c). Pero me gustaría hacerlo sin una clase adicional porque podría olvidar esa clase relacionada cuando necesito esa característica.

Esto es cuando Métodos extensión ser útil:

// Taking Reed Copsey's naming advice 
public enum Color 
{ 
    LightBlue, 
    LightGreen, 
    DarkGreen, 
    Black, 
    White, 
    LightGray, 
    Yellow 
} 

public static class Colors 
{ 
    public static bool IsLightColor(this Color color) 
    { 
     switch(color){ 
      case Color.LightBlue: 
      case Color.LightGreen: 
      case Color.DarkGreen: 
      case Color.LightGray: 
      return true; 
      default: 
      return false; 
     } 
    } 
} 

Mientras estas dos clases se encuentran en el mismo espacio de nombres, se puede ver el método estático como si perteneciera a la clase Color :

var color = Color.LightBlue; 
if(color.IsLightColor()) {...} 

(sombrero de punta a @Abdul por hacerme pensar en métodos de extensión)

5

Usted tendrá que escribir esto en una clase.

Personalmente, recomendaría volver a trabajar esto en una enumeración Color (singular) y una clase Colors. La clase Colors podría incluir métodos o propiedades que devuelvan "grupos" de enumeraciones (por ej .: IEnumerable<Color> LightColors { get { //...)

+0

Gracias. Usaré ese patrón como una alternativa si no hay una mejor manera. – brgerner

1

No hay subgrupos de enumeraciones, sin embargo, puede usar operaciones bit a bit para lograr esto hasta cierto punto en algunos casos. (Ver this post para una explicación decente)

Me quedaría con la clase de utilidad para ser sincero, no hay nada desordenado y significa que puede agregar otras descripciones, operaciones desplegables, etc. a medida que su sitio crece.

+0

Gracias. No me gustan las enumeraciones marcadas. No sé por qué. – brgerner

0

en C# se puede hacer de la siguiente manera (no estoy seguro, que realmente quiere esto o no)

public enum Colors 
    { 
    LightBlue, 
    LightGreen, 
    DarkGreen, 
    Black, 
    White, 
    LightGry, 
    Yellow 
    } 


public enum LightColors{ 
    LightBlue = Colors.LightBlue, 
    LightGreen = Colors.LightGreen, 
    White = Colors.White, 
    LightGray = Colors.LightGray, 
    Yellow = Colors.Yellow 
} 
public enum DarkColors{ 
    Black = Colors.Black, 
    DarkGreen = Colors.DarkGreen 

}

+1

Es un truco interesante, pero no me gusta mucho la idea de crear valores de diferentes * tipos * que se supone que representan la misma cosa fundamental. 'if (LightColors.LightBlue == Colors.LightBlue)' produce un error en tiempo de compilación, por ejemplo. – StriplingWarrior

+0

Manera muy interesante. ¡Gracias! – brgerner

+0

@StriplingWarrior, pero puedes hacer esto lanzando de la siguiente manera if ((int) LightColors.LightBlue == (int) Colors.LightBlue) – Abdul

1

Creo que la forma más simple sería especificar valores dentro de un rango. Por ejemplo:

public enum Color 
{ 
    LightBlue, 
    LightGreen, 
    LightGray, 
    White, 
    Yellow, 
    DarkGreen = 100, 
    Black 
} 

Entonces se supone que todos los valores superiores a 100 son colores oscuros.Incluso puede agregar un método de extensión para ese propósito

public bool static IsLightColor(this Color c) 
{ 
    return c < DarkGreen; 
} 

y utilizarlo como esto:

Color c = Color.LightBlue; 
if (c.IsLightColor()) 
{ 
     // do something 
} 
Cuestiones relacionadas