sábado, 23 de julio de 2016

Enumeraciones en C# - Tópicos Avanzados - Parte 2/4 | Conversión de Enumeraciones

Índice

1. Introducción
2. Palabras Clave
3. Generalidades
4. Conversión Enumeración
4.1 Cast explicito
4.2 Conversión Enum a entero
4.3 Conversión entero a valor de enumeración
4.4 Conversión con cadenas de caracteres
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

En este artículo C# se presenta la conversión de enumeraciones a otros tipos de datos. Para ello, primero se discute acerca de las representaciones posibles del valor de una enumeración; seguido se pasa a detallar el proceso de conversión de enumeraciones a valores enteros; más adelante el proceso inverso, es decir de un valor entero a una enumeración; y al final los medios disponibles para conversión de cadenas de caracteres a valores de una enumeración.

2. Palabras Clave

  • Cadena de caracteres
  • Conversión
  • Entero
  • Enum
  • Enumeración
  • object

3. Generalidades

De acuerdo con Albahari (2012), existen tres formas de presentar un valor de una enumeración en C#
  • como miembro de una enumeración, 
  • como valor entero inherente, y 
  • como una cadena de caracteres -i.e., objeto string.
Para conocer más acerca de estos mecanismos de representación, las siguientes secciones discuten con amplio detalle cómo el programador puede efectuar conversiones entre estas distintas representaciones.

4. Conversión Enumeración

4.1 Cast explícito

Para convertir un miembro de una enumeración a su representación numérica entera, el programador debe realizar una conversión explícita. Por ejemplo (código escrito en LINQPad): 

En las líneas 12-18 se declara la enumeración Lados para representar los lados, por ejemplo, de una figura geométrica.


En Main (líneas 1-8) se efectúan las siguientes tareas: 
  • Línea 4: Conversión explícita de valor de enumeración a entero.
  • Línea 7: Conversión explícita de valor entero a enumeración.

4.2 Conversión Enum a entero

La siguiente es una implementación particular que permite al programador convertir el valor de cualquier enumeración a un valor entero: 

static int ObtenerValorEntero(Enum @enum)
{
return (int) (object) @enum;
}

La clave aquí es primero convertir a object y luego efectuar una conversión explícita a int.

Sin embargo, es necesario advertir que este método falla cuando el tipo de dato del valor de la enumeración es long. Para arreglarlo esta implementación es apropiada: 

static decimal ObtenerValorNumerico(Enum @enum)
{
return Convert.ToDecimal(@enum);
}

El método Convert.ToDecimal convierte cualquier valor entero, en este caso de una enumeración, a una representación decimal, inclusive un valor de ulong.

De acuerdo con Albahari (2012), un tercer enfoque es invocar al método Enum.GetUnderlyingType ("Enum.GetUnderlyingType Method", 2016); así: 

static object ObtenerTipoNumericoAdyacente(Enum @enum)
{
Type tipoEntero = Enum.GetUnderlyingType(@enum.GetType());
return Convert.ChangeType(@enum, tipoEntero);
}

Desde código cliente: 

// Obtención tipo de dato adyacente:
object resultado = ObtenerTipoNumericoAdyacente(Lados.Izquierdo);
Console.WriteLine(resultado); // 4
Console.WriteLine(resultado.GetType()); // System.Int32

Como última alternativa particular, el programador puede usar 

static string ObtenerValorEnteroComoCadena(Enum @enum)
{
return @enum.ToString("D");
}

4.3 Conversión entero a valor de enumeración

El método static sobrecargado Enum.ToObject ("Enum.ToObject Method", 2016) convierte un valor de un tipo de dato numérico entero a un valor de una enumeración. Este es un ejemplo de uso: 

object l = Enum.ToObject(typeof(Lados), 3);
Console.WriteLine(l);

En la salida estándar se obtiene: 

Superior

O también a través de la versión dinámica: 

Lados l = (Lados) 3;

4.4 Conversión con cadenas de caracteres

El programador de C# puede recurrir a la invocación de Enum.Format ("Enum.Format Method", 2016) o ToString para crear la representación literal del valor de un miembro de una enumeración. Algunas de las cadenas de caracteres de formato que aceptan estos métodos son: 
  • "G": Representación estándar del valor de la enumeración como cadena de caracteres.
  • "D": Generación del tipo de dato entero adyacente del miembro de la enumeración.
  • "F": Para la representación hexadecimal.
  • "F": Formato de miembros combinados o compuestos de una enumeración.
Por otra parte, a través de Enum.Parse ("Enum.Parse Method", 2016) una representación literal -objeto string- puede ser convertida a un miembro de una enumeración: 

Lados l = (Lados) Enum.Parse(typeof(Lados), "Izquierdo"); // Lados.Izquierdo

5. Conclusiones

Se han demostrado las diferentes formas de convertir un valor de enumeración a diferentes tipos de datos, y el proceso inverso. Se demostró, además, cómo usar métodos static para obtener el tipo de dato adyacente de una enumeración, su representación entera.

La siguiente parte de esta serie explicará cómo obtener los valores de los miembros de una enumeración.

6. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Enum.GetUnderlyingType Method (Type) (System) (2016, julio 23). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.enum.getunderlyingtype(v=vs.110).aspx
Enum.ToObject Method (System) (2016, julio 23). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.enum.toobject(v=vs.110).aspx
Enum.Format Method (Type, Object, String) (System) (2016, julio 23). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.enum.format(v=vs.110).aspx
Enum.Parse Method (System) (2016, julio 23). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.enum.parse(v=vs.110).aspx


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.