Перечисление. Синтаксический анализ (), конечно, более опрятный путь?

Скажите, что у меня есть перечисление,

public enum Colours
{
    Red,
    Blue
}

Единственный путь I видит парсинга их, делает что-то как:

string colour = "Green";
var col = (Colours)Enum.Parse(typeOf(Colours),colour);

Это бросит Систему. ArgumentException, потому что "Зеленый" не член Colours перечисление.

Теперь я действительно очень не хочу перенести код в попытку/выгоду, нет ли никакой более опрятный способ сделать это, которое не вовлекает меня выполняющий итерации через каждого Colours перечисление и выполнение сравнения строк против colour?

60
задан Peter Mortensen 31 August 2012 в 20:36
поделиться

3 ответа

Сначала используйте Enum.IsDefined () , чтобы не зацикливаться на try / catch. Он вернет логическое значение того, является ли ввод допустимым членом этого перечисления.

57
ответ дан 24 November 2019 в 17:43
поделиться

Я считаю, что 4.0 имеет Enum.TryParse

В противном случае используйте метод расширения :

public static bool TryParse<T>(this Enum theEnum, string valueToParse, out T returnValue)
{
    returnValue = default(T);
    int intEnumValue;
    if (Int32.TryParse(valueToParse, out intEnumValue))
    {
        if (Enum.IsDefined(typeof(T), intEnumValue))
        {
            returnValue = (T)(object)intEnumValue;
            return true;
        }
    }
    return false;
}
41
ответ дан 24 November 2019 в 17:43
поделиться

Нет, для этого нет метода "без выброса" (как TryParse, который есть в некоторых других классах).

Однако вы можете легко написать свою собственную, чтобы инкапсулировать логику try-catch (или проверку IsDefined) в один вспомогательный метод, чтобы он не загрязнял код вашего приложения:

public static object TryParse(Type enumType, string value, out bool success)
{
  success = Enum.IsDefined(enumType, value);
  if (success)
  {
    return Enum.Parse(enumType, value);
  }
  return null;
}
6
ответ дан 24 November 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: