С# числовое значение enum как строка
У меня есть следующее перечисление:
public enum Urgency {
VeryHigh = 1,
High = 2,
Routine = 4
}
Я могу получить перечисление "значение" как строку следующим образом:
((int)Urgency.Routine).ToString() // returns "4"
Примечание. Это отличается от:
Urgency.Routine.ToString() // returns "Routine"
(int)Urgency.Routine // returns 4
Есть ли способ создать класс расширения или статический класс utliity, который обеспечит некоторый синтаксический сахар?:)
Ответы
Ответ 1
Вы должны просто использовать перегрузки метода Enums ToString, чтобы дать ему строку формата, это выведет значение перечисления в виде строки.
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
}
Ответ 2
Чтобы получить более "удобочитаемые" описания для перечислений (например, "Very High", а не "VeryHigh" в вашем примере), я украсил значения enum атрибутом следующим образом:
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; }
}
}
Затем используется метод расширения следующим образом:
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();
}
Затем вы можете просто вызвать
myEnum.ToDescription()
, чтобы отобразить ваше перечисление как более читаемый текст.
Ответ 3
Если вы хотите просто обработать это перечисление, используйте решение Mark Byer.
Для более общего решения:
public static string NumberString(this Enum enVal)
{
return Convert.ToDecimal(enVal).ToString("0");
}
Преобразование в десятичное означает, что вам не нужно явно обращаться с 8 различными допустимыми базовыми типами интегралов, так как все они преобразуют без потерь в десятичные, но не друг к другу (ulong и long не конвертируют без потерь между собой, но оба могут справиться со всем остальным). Выполнение этого, вероятно, будет быстрее (особенно если вы хорошо пойдете в своем порядке сравнения), но гораздо более подробный для относительно небольшого выигрыша.
Edit:
Вышеизложенное не так хорошо, как Франкентош, хотя Франкентош видел вопрос к реальной проблеме и решает его очень красноречиво.
Ответ 4
Если вы хотите, вы можете сделать метод расширения для всех перечислений:
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();
...
}
Ответ 5
Как насчет небольшого отражения? Должен работать со всеми базовыми типами.
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();
}
}
Тогда:
Console.WriteLine(Urgency.High.ToRawValueString()); //Writes "2"
Ответ 6
Отличный материал... Я добавил в мой проект метод расширения
public static class EnumExtensions
{
public static string NumberString(this Enum enVal)
{
return enVal.ToString("D");
}
}
Теперь я могу получить значение int - как строку - путем вызова Urgency.Routine.NumberString();
Спасибо Frankentosh и Jon:)
Ответ 7
Вы можете написать метод расширения для вашего конкретного типа:
public static class UrgencyExtension
{
public static string ToIntegerString(this Urgency u)
{
return ((int)u).ToString();
}
}
Используйте следующее:
Urgency u = Urgency.Routine;
string s = u.ToIntegerString();