Старый вопрос, но это меня недавно смутило, и Google привел меня сюда. Я нашел статью с дополнительным поиском, которая, наконец, заставила ее щелкнуть меня, и подумал, что я вернусь и поделюсь.
Суть в том, что Enum является структурой, что означает, что это тип значения ( source ). Но по сути он действует как производный тип базового типа (int, byte, long и т. Д.). Так что если вы можете думать о типе Enum как о том же самом, что и его базовый тип с некоторой дополнительной функциональностью / синтаксическим сахаром (как сказал Отавио), то вы будете знать об этой «проблеме» и сможете ее защитить.
Говоря об этом, вот сердце метода, который я написал, чтобы легко конвертировать / анализировать вещи в Enum:
if (value != null)
{
TEnum result;
if (Enum.TryParse(value.ToString(), true, out result))
{
// since an out-of-range int can be cast to TEnum, double-check that result is valid
if (Enum.IsDefined(typeof(TEnum), result.ToString()))
{
return result;
}
}
}
// deal with null and defaults...
Имеется переменная value
типа object, так как это расширение имеет «перегрузки», которые принимают int, int ?, string, Enum и Enum ?. Они все упакованы и отправлены в закрытый метод, который выполняет анализ. Используя TryParse
и IsDefined
в указанном порядке , я могу анализировать все только что упомянутые типы, включая строки со смешанным регистром, и это довольно надежно.
Использование примерно так (предполагает NUnit):
[Test]
public void MultipleInputTypeSample()
{
int source;
SampleEnum result;
// valid int value
source = 0;
result = source.ParseToEnum<SampleEnum>();
Assert.That(result, Is.EqualTo(SampleEnum.Value1));
// out of range int value
source = 15;
Assert.Throws<ArgumentException>(() => source.ParseToEnum<SampleEnum>());
// out of range int with default provided
source = 30;
result = source.ParseToEnum<SampleEnum>(SampleEnum.Value2);
Assert.That(result, Is.EqualTo(SampleEnum.Value2));
}
private enum SampleEnum
{
Value1,
Value2
}
Надеюсь, это кому-нибудь поможет.
Отказ от ответственности: мы не используем флаги / битовые маски ... это не было проверено в этом сценарии использования и, вероятно, не будет работать.