Возможно, вам удастся сойти с рук, просто используя Enum.TryParse
, как уже говорили другие.
Однако, если вы хотите более надежное / общее преобразование, которое позволяет вам преобразовывать больше, чем просто строки, тогдавам также нужно использовать Enum.IsDefined
, который, к сожалению, как вы обнаружили, не без учета регистра.
Enum.TryParse
это (может быть) case-нечувствительны.Но, к сожалению, он позволяет выходить за пределы диапазона!
Так что решение состоит в том, чтобы использовать их вместе (и порядок важен).
Я написал метод расширения, который делаеттолько то.Это позволяет преобразование из строки, int / int? И любой другой Enum / Enum?наберите вот так:
string value1 = "Value1";
Enum2 enum2 = value1.ParseToEnum<Enum2>();
Debug.Assert(enum2.ToString() == value1);
Enum1 enum1 = Enum1.Value1;
enum2 = enum1.ParseToEnum<Enum2>();
Debug.Assert(enum2.ToString() == enum1.ToString());
int value2 = 1;
enum2 = value2.ParseToEnum<Enum2>();
Debug.Assert(enum2.GetHashCode() == value2);
Вот суть метода.Это часть преобразования, которая отвечает на ваш вопрос.Переменная value
имеет тип object
из-за моих «перегрузок», которые принимают разные типы в качестве основного входа (см. Выше), но вы можете сделать это с переменной типа string
, просто отлично, если это всеВы хотите (очевидно, изменив value.ToString()
на value
).
if (value != null)
{
TEnum result;
if (Enum.TryParse(value.ToString(), true, out result))
{
// since an out-of-range int can be cast to TEnum, double-check that result is valid
if (Enum.IsDefined(typeof(TEnum), result.ToString()))
{
return result;
}
}
}
В моем методе расширения есть намного больше ... он позволяет вам задавать значения по умолчанию, обрабатывает только недопустимые интервалыхорошо, и полностью без учета регистра.Я могу опубликовать больше, если кому-то интересно.