Как получить значение неизвестного enum по имени enum и имени значения?
Извините за задание этого вопроса, но я не нашел правильного решения для этой задачи:
У меня есть Enum, который называется "myEnum" (MyEnum не известен этой функции)
Мне нужно получить значение int значения myEnum
Пример:
Программист назвал его enum "myEnum" :
public enum myEnum
{
foo = 1,
bar = 2,
}
моя функция должна делать следующее: Получите значение "foo" из "myEnum" по строке
Функция
должна открываться:
public int GetValueOf(string EnumName, string EnumConst)
{
}
поэтому, когда Programmer A открывает его:
int a = GetValueOf("myEnum","foo");
он должен вернуть 1
и когда Programmer B имеет Enum с именем "mySpace", хочет вернуть "bar" со значением 5
int a = GetValueOf("mySpace","bar")
должен вернуть 5
как я могу это сделать?
Ответы
Ответ 1
Вы можете использовать Enum.Parse для этого, но вам потребуется полное имя типа типа Enum, то есть: "SomeNamespace.myEnum"
:
public static int GetValueOf(string enumName, string enumConst)
{
Type enumType = Type.GetType(enumName);
if (enumType == null)
{
throw new ArgumentException("Specified enum type could not be found", "enumName");
}
object value = Enum.Parse(enumType, enumConst);
return Convert.ToInt32(value);
}
Также обратите внимание, что вместо используется Convert.ToInt32
. Это будет обрабатывать значения перечисления с базовыми типами, которые не являются Int32
. Тем не менее, это все равно вызовет OverflowException
, если ваше перечисление имеет базовое значение вне диапазона Int32
(т.е. Если это улунг как значение > int.MaxValue
).
Ответ 2
Попробуйте
int result = (int) Enum.Parse(Type.GetType(EnumName), EnumConst);
Ответ 3
Я предполагаю, что вы пытаетесь указать перечисление из строкового значения (это имя), тогда я предлагаю вам получить его членами через отражение, а затем сравните.
Помните, что отражение добавляет немного накладных расходов.
Ответ 4
Мне не ясно, если имя типа перечисления должно быть указано как строка.
Вам нужно использовать Enum.TryParse, чтобы получить значение Enum. В сочетании с общим методом вы можете сделать что-то вроде этого:
public int? GetValueOf<T>(string EnumConst) where T : struct
{
int? result = null;
T temp = default(T);
if (Enum.TryParse<T>(EnumConst, out temp))
{
result = Convert.ToInt32(temp);
}
return result;
}
Чтобы вызвать его, используйте это:
int? result = GetValueOf<myEnum>("bar");
if (result.HasValue)
{
//work with value here.
}