- позволяет анализировать значение по умолчанию в случае, если Значение перечисления не найдено.
- Не чувствительно к регистру.
Код: Выделить всё
public static T GetEnumFromString(string value, T defaultValue) where T : Enum
{
if (string.IsNullOrEmpty(value)) return defaultValue;
foreach (T item in Enum.GetValues(typeof(T)))
{
if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
}
return defaultValue;
}
Достаточно справедливо, но есть ли обходной путь, позволяющий общее перечисление, или мне придется имитировать функцию Parse и передавать тип в качестве атрибута, что приводит к уродливым требованиям к упаковке в вашем коде.
РЕДАКТИРОВАТЬ Все приведенные ниже предложения были высоко оценены, спасибо.
Остановились (я оставил цикл, чтобы сохранить нечувствительность к регистру - я использую это при анализе XML)
Код: Выделить всё
public static class EnumUtils
{
public static T ParseEnum(string value, T defaultValue) where T : struct, IConvertible
{
if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");
if (string.IsNullOrEmpty(value)) return defaultValue;
foreach (T item in Enum.GetValues(typeof(T)))
{
if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
}
return defaultValue;
}
}
РЕДАКТИРОВАТЬ 2: (13 апреля 2021 г.). Поскольку теперь эта проблема решена и поддерживается, начиная с C# 7.3, я изменил принятый ответ, хотя полное прочтение основных ответов стоит ради академического и исторического интереса
Подробнее здесь: https://stackoverflow.com/questions/791 ... to-an-enum
Мобильная версия