C# numeric enum value as string

Mam następujące enum:

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

Mogę pobrać enum "wartość" jako łańcuch w następujący sposób:

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

Uwaga: to różni się od:

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

Czy Jest jakiś sposób na stworzenie klasy extension lub statycznej klasy Utlity, która dostarczyłaby trochę cukru składniowego? :)

Author: Scott Beeson, 2010-08-10

7 answers

Powinieneś być w stanie użyć metody overloads of Enums ToString, aby nadać mu ciąg formatujący, to wydrukuje wartość enum jako ciąg znaków.

public static class Program
{
    static void Main(string[] args)
    {
        var val = Urgency.High;
        Console.WriteLine(val.ToString("D")); 
    }
}

public enum Urgency 
{ 
    VeryHigh = 1,
    High = 2,
    Low = 4
}
 84
Author: Scott Bartlett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-09 23:23:26

W celu uzyskania bardziej" czytelnych dla człowieka "opisów dla enum (np." bardzo wysoki "zamiast" bardzo wysoki " w twoim przykładzie) udekorowałem wartości enum atrybutem w następujący sposób:

public enum MeasurementType
{
    Each,

    [DisplayText("Lineal Metres")]
    LinealMetre,

    [DisplayText("Square Metres")]
    SquareMetre,

    [DisplayText("Cubic Metres")]
    CubicMetre,

    [DisplayText("Per 1000")]
    Per1000,

    Other
}


public class DisplayText : Attribute
{

    public DisplayText(string Text)
    {
        this.text = Text;
    }


    private string text;


    public string Text
    {
        get { return text; }
        set { text = value; }
    }
}

Następnie użyto metody rozszerzenia takiej jak Ta:

    public static string ToDescription(this Enum en)
    {

        Type type = en.GetType();

        MemberInfo[] memInfo = type.GetMember(en.ToString());

        if (memInfo != null && memInfo.Length > 0)
        {

            object[] attrs = memInfo[0].GetCustomAttributes(
                                          typeof(DisplayText),

                                          false);

            if (attrs != null && attrs.Length > 0)

                return ((DisplayText)attrs[0]).Text;

        }

        return en.ToString();

    }

Możesz po prostu zadzwonić

myEnum.ToDescription()
w celu wyświetlenia twojego enum jako bardziej czytelnego tekstu.
 19
Author: Stuart Helwig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-10 23:22:33

Jeśli chcesz po prostu poradzić sobie z tym enum, użyj rozwiązania Marka Byera.

Dla bardziej ogólnego rozwiązania:

public static string NumberString(this Enum enVal) 
{
    return Convert.ToDecimal(enVal).ToString("0");
}

Konwersja na dziesiętne oznacza, że nie musisz radzić sobie z 8 różnymi dozwolonymi bazowymi typami całek, ponieważ wszystkie z nich konwertują bezstratnie na dziesiętne, ale nie na siebie (ulong i long Nie konwertują bezstratnie między sobą, ale oba mogą obsłużyć całą resztę). Robienie tego byłoby prawdopodobnie szybsze (esp. jeśli dobrze wybierzesz w swojej kolejności porównanie), ale o wiele bardziej wyraziste dla stosunkowo małego zysku.

Edit:

[1]}powyższe nie jest tak dobre jak Frankentosh, Frankentosh przejrzał pytanie do prawdziwego problemu i rozwiązuje go bardzo elokwentnie.
 4
Author: Jon Hanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-09 23:56:18

Może trochę refleksji? Powinien działać ze wszystkimi typami bazowymi.

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

Wtedy:

Console.WriteLine(Urgency.High.ToRawValueString()); //Writes "2"
 3
Author: spender,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-09 23:08:46

Jeśli chcesz, możesz sprawić, że metoda rozszerzenia będzie działać dla wszystkich enum:

public static string ToValueString(this Enum enumValue) 
{
    if (enumValue.GetType().GetEnumUnderlyingType() == typeof(int))
        return ((int)(object)enumValue).ToString();
    else if (enumValue.GetType().GetEnumUnderlyingType() == typeof(byte))
        return ((byte)(object)enumValue).ToString();
    ... 
}        
 2
Author: Kirk Woll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-10 01:10:30

Świetny materiał ... Dodałem teraz metodę rozszerzenia do mojego projektu

public static class EnumExtensions 
{ 
    public static string NumberString(this Enum enVal) 
    { 
        return enVal.ToString("D"); 
    }
} 

Teraz mogę uzyskać wartość int-jako string-przez wywołanie Urgency.Routine.NumberString(); dzięki Frankentosh i Jon:)

 2
Author: David Moorhouse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 18:47:33

Możesz napisać metodę rozszerzenia dla określonego typu:

public static class UrgencyExtension
{
    public static string ToIntegerString(this Urgency u)
    {
        return ((int)u).ToString();
    }
}

Stosować w następujący sposób:

Urgency u = Urgency.Routine;
string s = u.ToIntegerString();
 1
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-09 22:38:44