Ответ 1
Используйте Enum.IsDefined
Enum.IsDefined(typeof(Enum1), 4) == true
но
Enum.IsDefined(typeof(Enum1), 1) == false
Я хочу проверить, что некоторый целочисленный тип принадлежит элементу перечисления (an).
Например,
public enum Enum1
{
member1 = 4,
member2 = 5,
member3 = 9,
member4 = 0
}
Enum1 e1 = (Enum1) 4 дает мне член1
Enum1 e2 = (Enum1) 10 ничего мне не дает, и я хочу проверить его.
Используйте Enum.IsDefined
Enum.IsDefined(typeof(Enum1), 4) == true
но
Enum.IsDefined(typeof(Enum1), 1) == false
Как говорит Сэм, вы можете использовать IsDefined. Это несколько неудобно. Вы можете посмотреть мою библиотеку Unconstrained Melody, которая позволила бы вам:
Enum1 e2 = (Enum1)10;
if (e2.IsNamedValue()) // Will return false
{
}
Вероятно, это не стоит для одного вызова enum, но если вы делаете много вещей с перечислениями, вы можете найти там что-то полезное.
Он должен быть быстрее, чем Enum.IsDefined
btw. Это только линейное сканирование на данный момент, но дайте мне знать, если вам нужно, чтобы это было улучшено:) (Большинство перечислений достаточно малы, что, вероятно, они не выиграют от HashSet
, но мы могли бы выполнить двоичный поиск...)
Вы просматриваете значения перечисления и сравниваете их с целым числом.
static bool EnumTest(int testVal, Enum e)
{
bool result = false;
foreach (var val in Enum.GetValues(typeof(Enum1)))
{
if ((int)val == testVal)
{
result = true;
break;
}
}
return result;
}
Изменить. Похоже, у Сэма есть лучшее решение.
Вы можете использовать Enum.GetValues для получения всех определенных значений. Затем проверьте, существует ли ваше значение в этом списке.
http://msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx
int testNum = 5;
bool isMember = Enum.GetValues(typeof(Enum1)).Cast<int>().Any(x => x == testNum);