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
,