¿Como has llegado a este portal?
Trabajo
Curiosidad
Amigos/as
Recomendación
No recuerdo
Compartir con alguien

Blog ASP.NET


Uso del tipo de dato Enum
1. Definición
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.

2. Escenario
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.

Este es un escenario ideal para crear un tipo de datos enumerator y aquí vamos:

Plegar

public enum  EnumEstado

{

    Indefinido = 0,

    Activo = 1,

    Pendiente = 2,

    Eliminado = 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.

Plegar

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;

        }

    }

}



3. Métodos
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.
Plegar

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.
Plegar

//Nombres posibles

foreach (string valores in Enum.GetNames(typeof(EnumEstado)))

{

    Console.WriteLine("Valores posible {0} ", valores);

}



Resultado:
Valores posible: Indefinido
Valores posible: Activo
Valores posible: Pendiente
Valores posible Eliminado

c)El método Enum.Format formatea la salida. Los formatos posibles son: "g", "x", "f", "d".
Plegar

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());


Resultado:
Valor enum: 1
Valor enum: Activo

d) El método Enum.GetValues generar una colección de valores de tipo EnumResultado.
Plegar

foreach (EnumEstado estado in Enum.GetValues(typeof(EnumEstado)))

 {

    Console.WriteLine("Valores posible: {0} - Tipo {1}", estado.ToString(), estado.GetType());

 }


Resultado:
Valores posible: Indefinido - Tipo Enumerator.EnumEstado
Valores posible: Activo - Tipo Enumerator.EnumEstado
Valores posible: Pendiente - Tipo Enumerator.EnumEstado
Valores posible: Eliminado - Tipo Enumerator.EnumEstado

e) El total de valores de la lista de enumeración
Plegar

Console.WriteLine("Total de valores: {0}", Enum.GetValues(typeof(EnumEstado)).Length);


Resultado:
Total de valores: 4

4. Funciones:

a) Con el siguiente código genero dos funciones para obtener el primer y último valor de la collección.
Plegar

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());


Resultado:
Primer valor: Indefinido
Ultimo valor: Eliminado

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.

Plegar

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;

}



5. Tipo subyacente
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.

Plegar

public enum EstadoBase : long

{

    RangoSuperior = Int64.MaxValue,

    RangoInferior= Int64.MinValue

}


Y la llamada correspondiente;
Console.WriteLine("Tipo subyacente: {0}",Enum.GetUnderlyingType(typeof(EstadoBase)));
da con resultado System.Int64.

6. Para saber más
Se puede utilizar el atributo System.FlagsAttribute para crear una enumeración de marcadores de bits.

7. Links
Documentación oficial de MSDN