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? :)
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
}
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.
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.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"
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();
...
}
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:)
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();
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