Вы можете сделать следующее:
public static bool IsDefinedInEnum(this Enum value, Type enumType)
{
if (value.GetType() != enumType)
return false;
return Enum.IsDefined(enumType, value);
}
код может использовать какое-то объяснение:
Первую проверку просто убедитесь, что значение перечисления и тип перечисления одинаковы. Если это не так, метод должен вернуться, очевидно, false
. Но почему это необходимо? Enum.IsDefined
покроет это тоже, верно?
В идеале, мы бы хотели, чтобы у меня был следующий будильник: IsDefinedIn<T>(this T value) where T: Enum
. Это было бы совершенно безопасно во время компиляции, но, к сожалению, ограничение T: Enum
недействительно. Это означает, что enumType
может быть любым, как typeof(object)
, нет механизма в языке для ограничения enumType
только для перечисления типов. Это может сделать бросок Enum.IsDefined
, если вы этого не хотите, вы должны сохранить первую проверку.
Учтите, что вы должны throw (или assert), если передать какой-либо тип, который не является Enum
, является ошибкой в вашем коде. Я только что показал вам, как можно обойти эту проблему, если это необходимо.
Вторая проверка просто гарантирует, что значение определено в перечислении. SomeEnumeration.SomeValue
вернет true
и (SomeEnumeration)5
вернет false
, если только нет члена перечисления с этим значением.