Приведение строкового значения к перечисляемому значению C # - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть класс MyClass, который имеет

public enum Days{Mon, Tue, Wed}

, а затем поле

public Days dayOfWeek;

Из другого класса в моем решении у меня есть значение строки (myString)или 0, 1 или 2.Я хочу установить экземпляр MyClass (называемого myClassInstance) поля dayOfWeek равным myStringvalue так, чтобы 0 означало понедельник, 1 означало вт ...

Iпробовал

myClassInstance.dayOfWeek = Convert.ToInt32(myString)

и

myClassInstance.dayOfWeek = (int) myString

, но ни одна из них не работает.Я уверен, что это просто.Почему эти методы не работают?

Ответы [ 7 ]

9 голосов
/ 30 декабря 2010

Попробуйте

string s = "0";
Days day = (Days)Enum.Parse(typeof(Days), s);

или

string s = "0";
Days day;
if(!Enum.TryParse(s, out day)) {
    // error handling
}

, чтобы изящно обработать случай, когда s не может быть проанализирован для экземпляра Days.

Это работает в соответствии с документацией для Enum.Parse, которая гласит

Преобразует строковое представление имени или числового значения одного или несколькихперечислимые константы для эквивалентного перечислимого объекта .

Кроме того, вы можете проверить, действительно ли экземпляр string представляет значение, определенное перечислением, с помощью

string s = "3";
bool defined = Enum.IsDefined(typeof(Days), s);
// defined is false

В этом случае Enum.Parse будет анализировать вслепую s, даже если он не представляет значение, определенное перечислением Days, и преобразование с результатом Enum.Parse в Days не завершится неудачей.

Кроме того, есть встроенное перечисление, которое представляет дни недели.Это перечисление System.DayOfWeek.Я бы предложил использовать это.

Наконец, если по какой-то причине вы не можете использовать System.DayOfWeek, вам следует как минимум переименовать ваше перечисление в Day вместо Days (уберите множественное число).Только перечисления, которые представляют флаги, должны быть множественными.Обратите внимание, что переменная day выше представляет день, а не дни.Вот почему вы должны переименовать enum в Day.Это соответствует соглашениям об именах , которые используют большинство программистов на C # и .NET.

6 голосов
/ 30 декабря 2010

Вам просто нужно привести int к Days перечислению после его преобразования:

myClassInstance.dayOfWeek = (Days)Convert.ToInt32(myString);

Вы также можете использовать Enum.TryParse (если вы находитесь в.NET 4) или Enum.Parse.В зависимости от того, насколько вы доверяете входящим данным, вы также можете позвонить Enum.IsDefined, чтобы убедиться, что целое число является действительным значением Days (в противном случае во всех этих случаях вы 'у вас будет экземпляр Days, который не соответствует ни одному из ваших именованных значений).

Days dayOfWeek;
if (!Enum.TryParse(myString, out dayOfWeek)) {
    dayOfWeek = Days.Mon; // or some other default, or throw
}

myClassInstance.dayOfWeek = dayOfWeek;

или

myClassInstance.dayOfWeek = (Days)Enum.Parse(typeof(Days), myString);

Кроме того, как уже упоминалось, вы можетеВы хотите использовать встроенное перечисление DayOfWeek вместо вашей пользовательской версии, если оно соответствует тому, что вы действительно хотите.

Кроме того, как уже упоминали другие, даже если это не так, Day - лучшее имя, основанное на правилах именования .NET, так как это не Flags enum.

2 голосов
/ 30 декабря 2010

Попробуйте:

Days d = (Days)Enum.Parse(typeof(Days), myString);

Более полный пример: здесь .

2 голосов
/ 30 декабря 2010

Попробуйте

myClassInstance.dayOfWeek = (Days)int.Parse(myString);

Знаете ли вы, что уже есть Enum, который вы можете использовать повторно, называемый DayOfWeek (http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx)

0 голосов
/ 30 декабря 2010

Это должно работать

myClassInstance.dayOfWeek = Enum.Parse(typeof(Days), myString);

Enump.Parse

0 голосов
/ 30 декабря 2010

То, что вы хотите сделать, это привести строку к int (или tryparse, если вы хотите сделать это хорошим способом)

Затем используйте следующий код для установки значения перечисления:

(Days) Enum.ToObject (typeof (Days), intValue);

0 голосов
/ 30 декабря 2010

Вам необходимо разыграть int до Days:

myClassInstance.dayOfWeek = (Days)Convert.ToInt32(myString);
...