Enum.IsDefined с помеченными перечислениями

В настоящее время я читаю книгу C# 4.0 в двух словах, которая, кстати, я считаю отличной книгой, которую даже опытные программисты могут использовать в качестве хорошего справочника.

Я оглядывался назад на главы об основах и наткнулся на хитрость, чтобы определить, определено ли определенное значение в Enum при использовании помеченных перечислений.
В книге говорится, что с помощью Enum.IsDefined не работает с помеченными перечислениями и предлагает обходной путь, как это:

static bool IsFlagDefined(Enum e)
{
    decimal d;
    return (!decimal.TryParse(e.ToString(), out d);
}

Это должно возвратить true, если определенное значение определено в перечислении, которое помечено.

Может кто-нибудь объяснить мне, почему это работает?

Заранее спасибо:)

2 ответа

Решение

В основном, звонит ToString на любом enum значение типа, объявленного с [Flags] Атрибут вернет что-то вроде этого для любого определенного значения:

SomeValue, SomeOtherValue

С другой стороны, если значение не определено в enum типа, то ToString просто создаст строковое представление целочисленного значения этого значения, например:

5

Так что это означает, что если вы можете проанализировать вывод ToString как число (не уверен, почему автор выбрал decimal), это не определено в типе.

Вот иллюстрация:

[Flags]
enum SomeEnum
{
    SomeValue = 1,
    SomeOtherValue = 2,
    SomeFinalValue = 4
}

public class Program
{
    public static void Main()
    {
        // This is defined.
        SomeEnum x = SomeEnum.SomeOtherValue | SomeEnum.SomeFinalValue;

        Console.WriteLine(x);

        // This is not (no bitwise combination of 1, 2, and 4 will produce 8).
        x = (SomeEnum)8;

        Console.WriteLine(x);
    }
}

Вывод вышеуказанной программы:

SomeOtherValue, SomeFinalValue
8

Таким образом, вы можете увидеть, как работает предложенный метод.

Если значение e не может быть создан с использованием комбинации флагов ToString() по умолчанию используется целое число И целые числа, конечно, будут разбираться как decimal,

Но почему ваш код разбирается как десятичный, мне не совсем понятно. Но, вероятно, целочисленные типы не будут работать для обоих enumс, которые основаны на Int64 а также UInt64,

Другие вопросы по тегам