Есть несколько других вопросов о том, как конвертировать перечисления и что происходит, если значение разобрано выходит за пределы диапазона, как в:Проверьте, если значение находится в диапазоне Enum без использования IsDefined
public enum SomeTypes
{
SomeType1 = 1,
SomeType2 = 2,
SomeType3 = 3
}
public class SomeClass
{
...
var inRange = (SomeTypes) 1;
var outOfRange = (SomeTypes) 5;
...
}
Выход из диапазона не приведет к какой-либо ошибке. Но я нашел трудный путь, что если вы попытаетесь сериализовать-десериализовать перечисление с внеземным значением, вы получите странные ошибки. Например, я получаю что-то вроде
«Ошибка синтаксического анализа сообщения или тайм-аут превышен»
, который держал меня искать другие причины, чем перечисления из-за границы диапазона.
Предложения по его устранению можно получить с помощью Enum.IsDefined
. Это, кажется, работает довольно хорошо, но есть это довольно смелое предупреждение о msdn:
«Не используйте System.Enum.IsDefined (System.Type, System.Object) для проверки диапазона перечисления, поскольку она основана на тип времени выполнения перечисления, который может меняться от версии к версии ».
Итак, мой вопрос, мы можем смело использовать Enum.IsDefined
или что это правильный способ проверить, если значение перечисления выходит за пределы диапазона без использования Enum.IsDefined
?
Используйте 'Enum.GetValues', найдите min и max of this , Затем вы можете легко проверить, находится ли значение в диапазоне или нет. Если курс, эта идея не будет работать для бит-флагов. –
Добавьте 'Parse()' или 'TryParse()' метод и используйте это вместо простого кастинга. – BCdotWEB
Это предупреждение основано на предположении, что декларация перечисления не совпадает с кодом проверки. Другими словами, более поздняя версия кода может добавлять дополнительные члены перечисления, но код, который использует перечисление, не был обновлен, чтобы справиться с этим. Может случиться, но вряд ли применим к вашему делу. Большая проблема заключается в том, что когда вы избегаете IsDefined, у вас будет новая ошибка в вашем коде. Поэтому игнорируйте этот совет. –