2017-02-05 9 views
1

У меня есть список, который может быть заполнен значениями из одного из двух перечислений или обоих из них. В основном этот код:Проверьте строку в нескольких Enums с оператором switch

public enum NamesA { Adam , Albert } 
public enum NamesB { Bert , Bob } 

, а затем

List<string> nameList = new List<string>(); 

if (reason) nameList.AddRange(Enum.GetNames(typeof(NamesA))); 
else if (reason) nameList.AddRange(Enum.GetNames(typeof(NamesB))); 
else 
{ 
    nameList.AddRange(Enum.GetNames(typeof(NamesA))); 
    nameList.AddRange(Enum.GetNames(typeof(NamesB))); 
} 

foreach (string name in nameList) 
    listBox1.Items.Add(name); 

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

Я знаю, что я могу проверить это следующим образом:

string chosenName = listBox1.SelectedItem.ToString(); 

if (chosenName.Equals(NamesA.Adam.ToString())) 
{ /*some stuff happens*/ } 
else if (chosenName.Equals(NamesB.Bob.ToString())) 
{ /*other stuff happens*/ } 
/* ...and so on */ 

... но я бы предпочел, используя переключатель. Я не могу найти способ работать. У кого-нибудь есть идея?


EDIT: Я хотел бы также сказать, что там должно быть место для коммутатора обрабатывать будущее NamesC, ... D, ... E, и т.д. перечислений.

+0

'переключатель (chosenName) {случай NamesA.Adam.ToString(): // логический разрыв; ....} ' – Developer

+0

' NamesA.Adam.ToString() 'не является постоянным выражением, которое может быть действительным для оператора case. – RBT

+0

Пожалуйста, проверьте мое решение. Надеюсь, этого будет достаточно. – RBT

ответ

0

Вы должны использовать целое число, которое является основным типом данных любого перечисления. Посмотрите, как я достиг этого:

Файл: CustomListItem.cs

namespace WindowsFormsApplication1 
{ 
    public class CustomListItem 
    { 
     public string Text { get; set; } 
     public int EnumValue { get; set; } 

    } 
} 

Файл: Form1.cs

namespace WindowsFormsApplication1 
{ 
    public enum NamesA { Adam = 0, Albert = 1 }; 
    public enum NamesB { Bert = 2, Bob = 3 } 

    public partial class Form1 : Form 
    { 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      List <CustomListItem> nameList = new List<CustomListItem>(); 
      int reason = 1; 
      if (reason == 1) 
       foreach (NamesA item in Enum.GetValues(typeof(NamesA))) 
        nameList.Add(new CustomListItem { Text = item.ToString(), EnumValue = (int)item }); 
      else if (reason == 2) 
      { 
       foreach (NamesB item in Enum.GetValues(typeof(NamesB))) 
        nameList.Add(new CustomListItem { Text = item.ToString(), EnumValue = (int)item }); 
      } 
      else 
      { 
       foreach (NamesA item in Enum.GetValues(typeof(NamesA))) 
        nameList.Add(new CustomListItem { Text = item.ToString(), EnumValue = (int)item }); 
       foreach (NamesB item in Enum.GetValues(typeof(NamesB))) 
       nameList.Add(new CustomListItem { Text = item.ToString(), EnumValue = (int)item }); 
      } 
      listBox1.DataSource = nameList; 
      listBox1.DisplayMember = "Text"; 
      listBox1.ValueMember = "EnumValue"; 

     } 

     private void button_Click(object sender, EventArgs e) 
     { 
      int chosenNameEnumValue = (int) listBox1.SelectedValue; 

      switch (chosenNameEnumValue) 
      { 
       case (int) NamesA.Adam: 
        /*some stuff happens*/ 
        break; 
       case (int) NamesA.Albert: 
        /*other stuff happens*/ 
        break; 
       case (int)NamesB.Bert: 
        /*some stuff happens*/ 
        break; 
       case (int)NamesB.Bob: 
        /*other stuff happens*/ 
        break; 
       default: 
        /* ...and so on */ 
        break; 
      } 
     } 
} 
} 
+1

Это приятное решение. Благодаря! – MrAtoni

-1

одним из решений могут быть таким:

public void Solution() 
    { 
     List<string> lst = new List<string>(); 
     lst.AddRange(Enum.GetNames(typeof(NamesA))); 
     string chosenName = "Bob"; 

     NamesA _result; 
     NamesB _resultB; 

     try 
     { 

      _result = (NamesA)Enum.Parse(typeof(NamesA), chosenName); 

      switch (_result) 
      { 
       case NamesA.Adam: 
        //{ /*some stuff happens*/ } 
        break; 
       case NamesA.Albert: 
        //{ /*some stuff happens*/ } 
        break; 
      } 
     } 
     catch (ArgumentException) 
     { 
      _resultB = (NamesB)Enum.Parse(typeof(NamesB), chosenName); 

      switch (_resultB) 
      { 
       case NamesB.Bert: 
        //{ /*some stuff happens*/ } 
        break; 
       case NamesB.Bob: 
        //{ /*some stuff happens*/ } 
        break; 
      } 
     } 
    } 
+0

Что делать, если выбранный тип перечисления - это имена B? – Developer

+0

Я немного изменил свой вопрос. Решение также должно быть в состоянии обрабатывать будущие NamesC, D, E ... перечисления: -/ – MrAtoni

+0

@MrAtoni, так что вы хотите, чтобы волшебный оператор switch имел случай для будущих членов вашего перечисления? –