Скажите, что у меня есть перечисление,
public enum Colours
{
Red,
Blue
}
Единственный путь I видит парсинга их, делает что-то как:
string colour = "Green";
var col = (Colours)Enum.Parse(typeOf(Colours),colour);
Это бросит Систему. ArgumentException, потому что "Зеленый" не член Colours
перечисление.
Теперь я действительно очень не хочу перенести код в попытку/выгоду, нет ли никакой более опрятный способ сделать это, которое не вовлекает меня выполняющий итерации через каждого Colours
перечисление и выполнение сравнения строк против colour
?
Сначала используйте Enum.IsDefined ()
, чтобы не зацикливаться на try / catch. Он вернет логическое значение того, является ли ввод допустимым членом этого перечисления.
Я считаю, что 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;
}
Нет, для этого нет метода "без выброса" (как 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;
}