J'ai besoin d'une méthode d'assistance pour comparer un caractère Enum et un caractère encadré à un objet

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

  •  01-07-2019
  •  | 
  •  

Question

J'ai une énumération qui se présente comme suit:

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

et je extrait des données de la base de données avec un seul caractère indiquant, vous l'avez deviné, que la transaction soit ouverte ou que la transaction soit clôturée.

maintenant parce que les données sortent de la base de données en tant qu'objet, j'ai énormément de temps pour écrire le code de comparaison.

Le mieux que je puisse faire est d'écrire:

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

Cependant, ce n’est pas le seul enum personnage auquel je dois faire face, j’en ai 5 ou 6 et écrire la même méthode pour eux est ennuyant pour le moins. Soi-disant, tous les enums sont hérités de System.Enum , mais si j'essaie de définir cela comme type d'entrée, je reçois des erreurs de compilation. C’est également dans .NET 1.1, donc les génériques sont hors de question.

Je lutte avec ça depuis un moment. Quelqu'un at-il une meilleure façon d'écrire cette méthode? De même, quelqu'un peut-il clarifier l'ensemble des enums hérités de System.Enum mais ne sont pas polymorphes?

Était-ce utile?

La solution

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' };

Autres conseils

Les énumérations sont généralement compliquées en C #. Ainsi, lors de l'utilisation de .NET 2.0, il est courant d'envelopper la syntaxe avec des génériques pour éviter d'avoir à écrire un code aussi maladroit.

Dans .NET 1.1, vous pouvez faire quelque chose comme ci-dessous, bien que ce ne soit pas beaucoup plus ordonné que l'extrait de code d'origine:

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

Cela correspond à peu près à la même quantité de code, mais vous effectuez maintenant une énumération plutôt qu'une comparaison de chaînes.

Vous pouvez également utiliser la documentation / du débogueur pour voir si obj_status est vraiment un objet ou si vous pouvez le convertir en toute sécurité en chaîne.

Je voudrais regarder Enum.Parse. Cela vous permettra de ré-analyser votre personnage dans l'énumération appropriée. Je pense que ça marche depuis le début jusqu'en C # 1.0. Votre code ressemblerait un peu à ceci:

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

Si vous devez simplement comparer des valeurs, vous pouvez utiliser quelque chose comme:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return (char)enum_status == (char)obj_status;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top