У меня есть перечисление:
public enum MyColours
{
Red,
Green,
Blue,
Yellow,
Fuchsia,
Aqua,
Orange
}
и у меня есть строка:
string colour = "Red";
Я хочу иметь возможность вернуться:
MyColours.Red
из:
public MyColours GetColour(string colour)
Пока у меня есть:
public MyColours GetColours(string colour)
{
string[] colours = Enum.GetNames(typeof(MyColours));
int[] values = Enum.GetValues(typeof(MyColours));
int i;
for(int i = 0; i < colours.Length; i++)
{
if(colour.Equals(colours[i], StringComparison.Ordinal)
break;
}
int value = values[i];
// I know all the information about the matched enumeration
// but how do i convert this information into returning a
// MyColour enumeration?
}
Как видите, я немного застрял. Есть ли в любом случае выбрать перечислитель по значению. Что-то вроде:
MyColour(2)
приведет к
MyColour.Green
c#
string
enumeration
Мэтт Кларксон
источник
источник
Ответы:
проверить System.Enum.Parse:
источник
Вы можете привести int к перечислению
Также есть опция Enum.Parse
источник
Учитывая последние и самые большие изменения в .NET (+ Core) и C # 7, вот лучшее решение:
переменная цвета может использоваться в рамках Enum.TryParse
источник
Все, что вам нужно, это Enum.Parse .
источник
Я пометил ответ OregonGhost +1, затем попытался использовать итерацию и понял, что это не совсем правильно, потому что Enum.GetNames возвращает строки. Вы хотите Enum.GetValues:
источник
Вы можете использовать,
Enum.Parse
чтобы получить значение enum из имени. Вы можете перебирать все значения с помощьюEnum.GetNames
, и вы можете просто привести int к enum, чтобы получить значение enum из значения int.Вот так, например:
или:
Последний выдает ArgumentException, если значение не найдено, вы можете перехватить его внутри функции и вернуть значение по умолчанию.
источник
источник
Parse
метода не существует.Как упоминалось в предыдущих ответах, вы можете приводить непосредственно к базовому типу данных (int -> enum type) или анализировать (string -> enum type).
но будьте осторожны - для перечислений нет .TryParse, так что вам понадобится блок try / catch для разбора, чтобы перехватывать ошибки.
источник
источник
Одна вещь, которая может быть вам полезна (помимо уже действительных / хороших ответов, предоставленных до сих пор), это идея StringEnum, представленная здесь
При этом вы можете определить свои перечисления как классы (примеры в vb.net):
И теперь вы можете использовать этот класс так же, как если бы вы использовали enum: eAuthenticationMethod.WindowsAuthentication, и это по сути было бы похоже на присвоение ' W ' логического значения WindowsAuthentication (внутри перечисления), и если бы вы просматривали это значение из свойств окно (или что-то еще, что использует свойство System.ComponentModel.Description), вы получите « Использовать проверку подлинности Windows ».
Я использовал это в течение долгого времени, и это делает код более понятным в намерениях.
источник
источник
Возможно, вы также захотите ознакомиться с некоторыми предложениями в этом блоге: Мой новый маленький друг, Enum <T>
В посте описан способ создания очень простого универсального вспомогательного класса, который позволяет вам избежать уродливого синтаксиса приведения, присущего
Enum.Parse
- вместо этого вы в конечном итоге напишите что-то вроде этого в своем коде:Или ознакомьтесь с некоторыми комментариями в том же посте, в которых говорится об использовании метода расширения для достижения аналогичных целей.
источник