Un enumerador es un tipo de dato que representa una colección de valores. Estos valores están asociados por defecto a un valor númerico de tipo Int.32 llamado tipo subyacente. De esta forma se facilita la lectura y desarrollo del código. Es una forma limpia de encapsular valores de constantes dentro de una aplicación.
Tenemos un repositorio de datos de artículos con una propiedad una lista de valores que puede asumir la propiedad Estado.
Estos valores son Activo, Pendiente y Eliminado. y representados en un repositorio de datos con los valores 1, 2 y 3.
La clase Articulo recibe en el constructor el valor estado de tipo númerico y lo transforma al tipo enum mediante el método setEstado.
public class Articulo
{
private string _nombre;
private int _precio;
private EnumEstado _estado;
public string Nombre
{
get { return _nombre; }
set { _nombre = value; }
}
public int Precio
{
get { return _precio; }
set { _precio = value; }
}
public EnumEstado Estado
{
get { return _estado; }
set { _estado = value; }
}
public Articulo(String nombre, int precio, int estado)
{
this._nombre = nombre;
this.Precio = precio;
setEstado(estado);
}
private void setEstado(int estado)
{
if (Enum.IsDefined(typeof(EnumEstado), estado))
{
Estado=(EnumEstado)estado;
}else {
Estado=EnumEstado.Indefinido;
}
}
}
a) El primer método que se puede observar es Enum.IsDefined. Determina si el valor númerico se encuentra definido dentro de la lista de valores aceptables. De lo contrario quiero asignarlo al valor Indefinido.
private void setEstado(int estado)
{
if (Enum.IsDefined(typeof(EnumEstado), estado))
{
Estado=(EnumEstado)estado;
}else {
Estado=EnumEstado.Indefinido;
}
}
b) Con el método Enum.GetNames obtengo los valores posibles del enum.
//Nombres posibles
foreach (string valores in Enum.GetNames(typeof(EnumEstado)))
{
Console.WriteLine("Valores posible {0} ", valores);
}
c)El método Enum.Format formatea la salida. Los formatos posibles son: "g", "x", "f", "d".
Console.WriteLine("Valor enum: {0} Tipo de datos: {1}", Enum.Format(typeof(EnumEstado), persona.Estado, "d"), Enum.Format(typeof(EnumEstado), persona.Estado, "d").GetType());
Console.WriteLine("Valor enum: {0} Tipo de datos: {1}", Enum.Format(typeof(EnumEstado), persona.Estado, "g"), Enum.Format(typeof(EnumEstado), persona.Estado, "g").GetType());
d) El método Enum.GetValues generar una colección de valores de tipo EnumResultado.
foreach (EnumEstado estado in Enum.GetValues(typeof(EnumEstado)))
{
Console.WriteLine("Valores posible: {0} - Tipo {1}", estado.ToString(), estado.GetType());
}
Console.WriteLine("Total de valores: {0}", Enum.GetValues(typeof(EnumEstado)).Length);
a) Con el siguiente código genero dos funciones para obtener el primer y último valor de la collección.
private static EnumEstado PrimerValor()
{
EnumEstado[] arrayestado = (EnumEstado[])Enum.GetValues(typeof(EnumEstado));
return arrayestado[0];
}
private static EnumEstado UltimoValor()
{
EnumEstado[] arrayestado = (EnumEstado[])Enum.GetValues(typeof(EnumEstado));
return arrayestado[arrayestado.Length - 1];
}
Console.WriteLine("Primer valor: {0}",PrimerValor());
Console.WriteLine("Ultimo valor: {0}", UltimoValor());
b) Para utilizar los valores en un control RadioButton, DropDownList puedo crear una función con un valor genérico de tipo enumerador y que encapsule los valores en un hashtable o en un dictionary y llamarlo en el correspondiente DataSurce.
private static Dictionary<string, string> BindGenericoToDictionary<Generico>()
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
Type typeofgenerico = typeof(Generico);
foreach (string valores in Enum.GetNames(typeofgenerico))
{
//Utilizo Enum Format con mascara "d" para obtener el valor key
string key = Enum.Format(typeofgenerico,Enum.Parse(typeofgenerico, valores),"g");
dictionary.Add(key, valores);
}
return dictionary;
}
private static Hashtable BindGenericoToHashTable<Generico>()
{
Hashtable hashtable = new Hashtable();
Type typeofgenerico = typeof(Generico);
foreach (string valores in Enum.GetNames(typeofgenerico))
{
//Utilizo Enum Format con mascara "d" para obtener el valor key
string key = Enum.Format(typeofgenerico, Enum.Parse(typeofgenerico, valores), "d");
hashtable.Add(key,valores);
}
return hashtable;
}
Como expliqué en la definición los enum tienen un tipo de datos subyacente que por defecto es Int32. Aquí defino un enum con tipo subyacente long y con dos valores, las constantes de valor máximo y mínimo del tipo Int64.
public enum EstadoBase : long
{
RangoSuperior = Int64.MaxValue,
RangoInferior= Int64.MinValue
}
da con resultado System.Int64.
Se puede utilizar el atributo System.FlagsAttribute para crear una enumeración de marcadores de bits.