Перечисление может быть любым значением его базового целочисленного типа. Он не ограничен только именованными константами.
Например, следующее совершенно правильно:
enum Foo{
A,
B,
C,
D
}
Foo x = (Foo)5;
Даже если 5 не соответствует именованной константе, оно все равно является допустимым значением для Foo
, поскольку базовый тип для Foo
равен Int32
.
Если бы кто-то вызвал x.ToString()
, возвращаемое значение было бы просто "5", поскольку ни одна из именованных констант не соответствует значению x.
Enum.Parse()
является обратной функцией Enum.ToString()
. Вы должны ожидать, что Enum.ToString()
может вернуть то, что Enum.Parse()
может принять. Это включает, например, значения через запятую для перечисления флагов:
[Flags]
enum Foo{
A = 1,
B = 2,
C = 4,
D = 8
}
Foo x = Foo.A | Foo.B | Foo.C | Foo.D;
int i = (int)x;
string s = x.ToString();
Console.WriteLine(i);
Console.WriteLine(s);
Console.WriteLine((Foo)Enum.Parse(typeof(Foo), i.ToString()) == x);
Console.WriteLine((Foo)Enum.Parse(typeof(Foo), s) == x);
Выход:
15
A, B, C, D
True
True
EDIT:
То, что вы действительно хотите, выглядит примерно так:
static Enum GetEnumValue(Type enumType, string name){
// null-checking omitted for brevity
int index = Array.IndexOf(Enum.GetNames(enumType), name);
if(index < 0)
throw new ArgumentException("\"" + name + "\" is not a value in " + enumType, "name");
return Enum.GetValues(enumType).GetValue(index);
}
или версия без учета регистра:
static Enum GetEnumValue(Type enumType, string name, bool ignoreCase){
// null-checking omitted
int index;
if(ignoreCase)
index = Array.FindIndex(Enum.GetNames(enumType),
s => string.Compare(s, name, StringComparison.OrdinalIgnoreCase) == 0);
// or StringComparison.CurrentCultureIgnoreCase or something if you
// need to support fancy Unicode names
else index = Array.IndexOf(Enum.GetNames(enumType), name);
if(index < 0)
throw new ArgumentException("\"" + name + "\" is not a value in " + enumType, "name");
return Enum.GetValues(enumType).GetValue(index);
}