Подтвердить что ты не робот

Убедитесь, что целочисленный тип принадлежит члену перечисления

Я хочу проверить, что некоторый целочисленный тип принадлежит элементу перечисления (an).

Например,

public enum Enum1
{
    member1 = 4,

    member2 = 5,

    member3 = 9,

    member4 = 0
}

Enum1 e1 = (Enum1) 4 дает мне член1

Enum1 e2 = (Enum1) 10 ничего мне не дает, и я хочу проверить его.

4b9b3361

Ответ 1

Используйте Enum.IsDefined

Enum.IsDefined(typeof(Enum1), 4) == true

но

Enum.IsDefined(typeof(Enum1), 1) == false

Ответ 2

Как говорит Сэм, вы можете использовать IsDefined. Это несколько неудобно. Вы можете посмотреть мою библиотеку Unconstrained Melody, которая позволила бы вам:

Enum1 e2 = (Enum1)10;
if (e2.IsNamedValue()) // Will return false
{
}

Вероятно, это не стоит для одного вызова enum, но если вы делаете много вещей с перечислениями, вы можете найти там что-то полезное.

Он должен быть быстрее, чем Enum.IsDefined btw. Это только линейное сканирование на данный момент, но дайте мне знать, если вам нужно, чтобы это было улучшено:) (Большинство перечислений достаточно малы, что, вероятно, они не выиграют от HashSet, но мы могли бы выполнить двоичный поиск...)

Ответ 3

Вы просматриваете значения перечисления и сравниваете их с целым числом.

    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;
    }

Изменить. Похоже, у Сэма есть лучшее решение.

Ответ 4

Вы можете использовать Enum.GetValues ​​для получения всех определенных значений. Затем проверьте, существует ли ваше значение в этом списке.
http://msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx

Ответ 5

int testNum = 5;
bool isMember = Enum.GetValues(typeof(Enum1)).Cast<int>().Any(x => x == testNum);