2011-08-09 4 views
4

Рассмотрим следующий перечисление:Преобразование CSV из перечислений флагов и наоборот

[Flags] 
public enum MyEnum 
{ 
    Option1 = 0, 
    Option2 = 1, 
    Option3 = 2, 
    Option4 = 4 
} 

Есть ли способ, в котором я могу получить строку, эквивалентную (не значение) в виде строки CSV? Обычно я могу использовать функцию Enum.GetName для преобразования типа в строковое представление, однако, если вы используете комбинацию, это возвращает значение null.

Поэтому в основном я хотел бы преобразовать:

var options = MyEnum.Option1 | MyEnum.Option3; 

в

"Option1, Option3" 

Тогда я хотел бы иметь возможность конвертировать "ОПЦИЯ1, OPTION3" назад MyEnum.Option1 | MyEnum.Option2.

Предложения?

+0

Верно ли «enum.GetName» null, только когда его комбинация значений или все время? – Kratz

+0

@ Kratz - Извините, когда это комбинация, я обновляю свой пост, поскольку на самом деле это не ясно. – James

ответ

6

Ну, кроме Option1, не имея особого смысла в перечислении флагов, это работает по умолчанию, используя Enum.Parse и Enum.ToString().

Начните с этого:

var options = MyEnum.Option2 | MyEnum.Option3; 
Console.WriteLine(options.ToString()); 
// Outputs: Option2, Option3 

Тогда вы всегда можете сделать это:

var options2 = (MyEnum) Enum.Parse(typeof (MyEnum), "Option2, Option3"); 

Теперь попробуйте это:

Console.WriteLine((options2 & MyEnum.Option2) == MyEnum.Option2); 
Console.WriteLine((options2 & MyEnum.Option4) == MyEnum.Option4); 
// Outputs: 
// true 
// false 

Что кажется, что это делает именно то, что вы хотите (опять же, игнорируя тот факт, что Option1 в вашем примере никогда не произойдет)

docs: Enum.Parse

+0

Я никогда не понимал, что 'ToString()' будет делать это в .NET 3.5, я думал, что это особенность .NET 4.0 ... глупо меня. +1 – James

0

Вы можете сделать Enum.GetValues, который получает массив значений перечисления. Затем вы можете просмотреть эти значения и протестировать их против своего значения Enum, объединив значение строки для каждого из них. Другой путь вокруг вас может проходить через значения с помощью функции Enum.GetName, чтобы проверить, содержит ли ваша строка это имя значений, а затем перестроит значение.

Смежные вопросы