Есть ли простой способ конвертировать ac # enum в строку и обратно? - PullRequest
3 голосов
/ 27 января 2011

Мне нужно преобразовать список значений перечислений в одну строку для хранения в моей БД; затем конвертировать обратно, когда я получаю из базы данных.

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

Итак, в приведенном ниже примере, если пользователь выберет Мать, Отец и Сестра, значение, хранимое в базе данных, будет равно «0,1,3»

  public enum MyEnum
    {
        Mother = 0,
        Father = 1,
        Gran = 2,
        Sister = 3,
        Brother = 4
    }

Я новичок в c #, поэтому не уверен, есть ли хороший готовый способ сделать это - я не смог найти ничего очевидного при поиске в Google!

Ура заранее :) - L

Ответы [ 8 ]

9 голосов
/ 27 января 2011

Перечисления явно могут быть преобразованы в целые числа

int value = (int)MyEnum.Mother;

и

   MyEnum value = (MyEnum)1;

Для строк используйте ToString и Enum.Parse

string value = MyEnum.Mother.ToString();

и

MyEnum value = (MyEnum)Enum.Parse(typeof(MyEnum),"Mother");
4 голосов
/ 27 января 2011

Если вы измените свои значения перечисления на:

[Flags]
public enum MyEnum
    {
        Mother = 1,
        Father = 2,
        Gran = 4,
        Sister = 8,
        Brother = 16,
    }

Тогда вы можете сохранить Отца и Бабу как 6

Сестра и Брат как 24 и т.д.

, используя двоичный файлчисла, вы не должны получать повторяющиеся значения, комбинируя их

3 голосов
/ 27 января 2011

Следующее будет преобразовывать туда и обратно между массивом значений Enum через «0,1,3» в соответствии с запросом:

MyEnum[] selection = { MyEnum.Mother, MyEnum.Father, MyEnum.Sister };

string str = string.Join(",", selection.Cast<int>());

MyEnum[] enm = str.Split(',').Select(s => int.Parse(s)).Cast<MyEnum>().ToArray();
3 голосов
/ 27 января 2011

Просто используйте ToString для преобразования в имя и используйте Enum.TryParse (или Enum.Parse, если вы не включены.NET 4) для обратного преобразования.

Если вы хотите, чтобы одно поле перечисления содержало несколько значений (например, MyEnum.Mother | MyEnum.Father), вам необходимо преобразовать его в Flags enum , как предложил @ WraithNath .В противном случае вы говорите о сохранении каждой опции отдельно (невозможно сохранить Mother и Father в одном поле с вашей текущей настройкой).

2 голосов
/ 27 января 2011

из вашего кода это

MyEnum a = MyEnum.Mother;
string thestring = a.ToString();
MyEnum b = (MyEnum) Enum.Parse(typeof(MyEnum), thestring);
1 голос
/ 27 января 2011

String Equivelant

MyEnum value = MyEnum.Father;
value.ToString(); // prints Father

Разбор

(MyEnum)Enum.Parse(typeof(MyEnum), "Father"); // returns MyEnum.Father
0 голосов
/ 27 января 2011

В дополнение к предложению Jamiec (которое хорошо подходит для ваших нужд), если вам нужно защитно закодировать ваш кастинг, попробуйте:

if (Enum.IsDefined(typeof(MyEnum), <your database value>))
{
    // Safe to convert your enumeration at this point:
    MyEnum value = (MyEnum)1;   
}
0 голосов
/ 27 января 2011

Enum с можно приводить к целочисленным значениям и из них.Это, вероятно, ваш лучший выбор.

Если вы действительно хотите использовать строки, ToString вернет «Мать», «Отец», «Баба» и т. Д. Возврат из строки будет просто функцией:

private MyEnum GetEnumValue(string fromDB)
{
    if( fromDB == "Mother" ) return MyEnum.Mother;
    else if( fromDB == "Father") return MyEnum.Father;
    //etc. etc.
}

РЕДАКТИРОВАТЬ: ответ Яна на приведение назад - это более "C # -ey" способ сделать это, и он гораздо более расширяемый (обрабатывает добавление новых значений в перечисление гораздо более гибко).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...