C # numeric enum valeur sous forme de chaîne

J’ai l’énumération suivante:

public enum Urgency { VeryHigh = 1, High = 2, Routine = 4 } 

Je peux récupérer une enum “value” sous forme de chaîne comme ceci:

 ((int)Urgency.Routine).ToSsortingng() // returns "4" 

Note: Ceci est différent de:

 Urgency.Routine.ToSsortingng() // returns "Routine" (int)Urgency.Routine // returns 4 

Y a-t-il un moyen de créer une classe d’extension, ou une classe d’utilité statique, qui fournirait du sucre syntaxique? 🙂

    Vous devriez juste être en mesure d’utiliser les surcharges de la méthode Enums ToSsortingng pour lui donner une chaîne de format, cela affichera la valeur de l’enum sous forme de chaîne.

     public static class Program { static void Main(ssortingng[] args) { var val = Urgency.High; Console.WriteLine(val.ToSsortingng("D")); } } public enum Urgency { VeryHigh = 1, High = 2, Low = 4 } 

    Pour obtenir plus de descriptions “lisibles par l’homme” pour les énumérations (par exemple “Très élevé” plutôt que “TrèsHigh” dans votre exemple), j’ai décoré les valeurs d’énumération avec l’atsortingbut comme suit:

     public enum MeasurementType { Each, [DisplayText("Lineal Metres")] LinealMetre, [DisplayText("Square Metres")] SquareMetre, [DisplayText("Cubic Metres")] CubicMetre, [DisplayText("Per 1000")] Per1000, Other } public class DisplayText : Atsortingbute { public DisplayText(ssortingng Text) { this.text = Text; } private ssortingng text; public ssortingng Text { get { return text; } set { text = value; } } } 

    Ensuite, utilisé une méthode d’extension comme celle-ci:

      public static ssortingng ToDescription(this Enum en) { Type type = en.GetType(); MemberInfo[] memInfo = type.GetMember(en.ToSsortingng()); if (memInfo != null && memInfo.Length > 0) { object[] attrs = memInfo[0].GetCustomAtsortingbutes( typeof(DisplayText), false); if (attrs != null && attrs.Length > 0) return ((DisplayText)attrs[0]).Text; } return en.ToSsortingng(); } 

    Vous pouvez alors simplement appeler

      myEnum.ToDescription () 

    afin d’afficher votre enum comme texte plus lisible.

    Si vous voulez simplement gérer cette enum, utilisez la solution de Mark Byer.

    Pour une solution plus générale:

     public static ssortingng NumberSsortingng(this Enum enVal) { return Convert.ToDecimal(enVal).ToSsortingng("0"); } 

    Convertir en décimal signifie que vous n’avez pas besoin de traiter explicitement les 8 types intégraux sous-jacents autorisés, car ils se convertissent tous sans perte en nombre décimal mais pas entre eux (ulong et long ne convertissent pas sans perte les uns des autres mais les deux peuvent gérer tout le rest). Faire cela serait probablement plus rapide (surtout si vous choisissez bien dans votre ordre de comparaison), mais beaucoup plus verbeux pour relativement peu de gain.

    Modifier:

    Ce qui précède n’est pas aussi bon que celui de Frankentosh, mais Frankentosh a bien compris la question et a résolu le problème avec beaucoup d’éloquence.

    Que diriez-vous d’un petit reflet? Devrait fonctionner avec tous les types sous-jacents.

     public static class EnumTools { public static ssortingng ToRawValueSsortingng(this Enum e) { return e .GetType() .GetFields(BindingFlags.Public | BindingFlags.Static) .First(f => f.Name==e.ToSsortingng()) .GetRawConstantValue() .ToSsortingng(); } } 

    Alors:

     Console.WriteLine(Urgency.High.ToRawValueSsortingng()); //Writes "2" 

    Si vous vouliez, vous pourriez faire fonctionner la méthode d’extension pour toutes les énumérations:

     public static ssortingng ToValueSsortingng(this Enum enumValue) { if (enumValue.GetType().GetEnumUnderlyingType() == typeof(int)) return ((int)(object)enumValue).ToSsortingng(); else if (enumValue.GetType().GetEnumUnderlyingType() == typeof(byte)) return ((byte)(object)enumValue).ToSsortingng(); ... } 

    Super choses … J’ai maintenant ajouté une méthode d’extension à mon projet

     public static class EnumExtensions { public static ssortingng NumberSsortingng(this Enum enVal) { return enVal.ToSsortingng("D"); } } 

    Maintenant, je peux obtenir la valeur int – sous forme de chaîne de caractères – en appelant Urgency.Routine.NumberSsortingng(); Merci à Frankentosh et Jon 🙂

    Vous pouvez écrire une méthode d’extension pour votre type spécifique:

     public static class UrgencyExtension { public static ssortingng ToIntegerSsortingng(this Urgency u) { return ((int)u).ToSsortingng(); } } 

    Utilisez comme suit:

     Urgency u = Urgency.Routine; ssortingng s = u.ToIntegerSsortingng();