Necesito un método auxiliar para comparar un char Enum y un char boxed con un objeto

StackOverflow https://stackoverflow.com/questions/105609

  •  01-07-2019
  •  | 
  •  

Pregunta

Tengo una enumeración que tiene el siguiente aspecto:

public enum TransactionStatus { Open = 'O', Closed = 'C'};

y estoy extrayendo datos de la base de datos con un solo carácter que indica (lo adivinaste) si 'O' la transacción está abierta o 'C' la transacción está cerrada.

Ahora, debido a que los datos salen de la base de datos como un objeto, me está costando mucho escribir el código de comparación.

Lo mejor que puedo hacer es escribir:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return ((char)enum_status).ToString() == obj_status.ToString();
}

Sin embargo, esta no es la única enumeración de caracteres con la que tengo que lidiar, tengo 5 o 6 y escribir el mismo método para ellos es, como mínimo, molesto. Supuestamente todas las enumeraciones heredan de System.Enum pero si intento configurarlo como tipo de entrada, obtengo errores de compilación.Esto también está en .NET 1.1, por lo que los genéricos están fuera de discusión.

He estado luchando con esto por un tiempo.¿Alguien tiene una mejor manera de escribir este método?Además, ¿alguien puede aclarar que las enumeraciones completas se heredan de System.Enum pero no son polimórficas?

¿Fue útil?

Solución

static void Main(string[] args)
{
    object val = 'O';
    Console.WriteLine(EnumEqual(TransactionStatus.Open, val));

    val = 'R';
    Console.WriteLine(EnumEqual(DirectionStatus.Left, val));

    Console.ReadLine();
}

public static bool EnumEqual(Enum e, object boxedValue)
{                        
    return e.Equals(Enum.ToObject(e.GetType(), (char)boxedValue));
}

public enum TransactionStatus { Open = 'O', Closed = 'C' };
public enum DirectionStatus { Left = 'L', Right = 'R' };

Otros consejos

Las enumeraciones generalmente son confusas en C#, por lo que cuando se usa .NET 2.0 es común ajustar la sintaxis con genéricos para evitar tener que escribir un código tan torpe.

En .NET 1.1 puedes hacer algo como lo siguiente, aunque no es mucho más ordenado que el fragmento original:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status)
{
    return (enum_status == Enum.Parse(typeof(TransactionStatus), obj_status.ToString()));
}

Esta es aproximadamente la misma cantidad de código, pero ahora está haciendo una enumeración en lugar de una comparación de cadenas.

También puede utilizar el depurador/documentación para ver si obj_status realmente es un objeto o si puedes convertirlo de forma segura en una cadena.

Yo echaría un vistazo a Enum.Parse.Le permitirá analizar su carácter nuevamente en la enumeración adecuada.Creo que funciona desde C# 1.0.Su código se parecería un poco a esto:

TransactionStatus status = (TransactionStatus)Enum.Parse(typeof(TransactionStatus), obj.ToString());

Si solo tienes que comparar valores, puedes usar algo como:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return (char)enum_status == (char)obj_status;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top