2013-10-10 4 views
2

Я заполняю три списка со значениями из трех соответствующих перечислений. Есть ли способ избежать трех отдельных, но очень похожих методов? Вот что у меня сейчас:Как избежать повторения кода с перечислениями в C#?

private void PopulateListBoxOne() 
    { 
     foreach (EnumOne one in Enum.GetValues(typeof(EnumOne))) 
     { 
      lstOne.Items.Add(one); 
     } 
     lstOne.SelectedIndex   = 0; 
    } 

    private void PopulateListBoxTwo() 
    { 
     foreach (EnumTwo two in Enum.GetValues(typeof(EnumTwo))) 
     { 
      lstTwo.Items.Add(two); 
     } 
     lstTwo.SelectedIndex   = 0; 
    } 

    private void PopulateListBoxThree() 
    { 
     foreach (EnumThree three in Enum.GetValues(typeof(EnumThree))) 
     { 
      lstThree.Items.Add(three); 
     } 
     lstThree.SelectedIndex   = 0; 
    } 

Но я вместо этого предпочитают иметь один метод (который я мог бы назвать три раза) ищет что-то вроде:

private void PopulateListBox(ListBox ListBoxName, Enum EnumName) 
{ 
    // ... code here! 
} 

Я довольно неопытным программистом, поэтому, хотя я и делал поиск, я не был уверен, что искал. Извините, если на это был дан ответ; Я был бы равно признателен за то, что будет показан существующий ответ. Благодаря!

+0

ответ Wudzik работал прямо из коробки. Спасибо - прекрасное начало моего опыта переполнения стека! (Спасибо за другие ответы, хотя я еще не пробовал их). – Pyraemon

ответ

5

Вам необходимо пройти тип перечисления в ваш метод

private void PopulateListBox(ListBox ListBoxName, Type EnumType) 
{ 
    foreach (var value in Enum.GetValues(EnumType)) 
    { 
     ListBoxName.Items.Add(value); 
    } 
    ListBoxName.SelectedIndex=0; 
} 

так называют это нравится:

PopulateListBox(lstThree,typeof(EnumThree)); 
0

Вы могли бы попробовать что-то вроде

private List<T> PopulateList<T>() 
    { 
     List<T> list = new List<T>(); 
     foreach (T e in Enum.GetValues(typeof(T))) 
     { 
      list.Add(e); 
     } 
     return list; 
    } 
3

Вы можете использовать общий метод :

private void PopulateListBox<TEnum>(ListBox listBox, bool clearBeforeFill, int selIndex) where TEnum : struct, IConvertible 
{ 
    if (!typeof(TEnum).IsEnum) 
     throw new ArgumentException("T must be an enum type"); 

    if(clearBeforeFill) listBox.Items.Clear(); 
    listBox.Items.AddRange(Enum.GetNames(typeof(TEnum))); // or listBox.Items.AddRange(Enum.GetValues(typeof(TEnum)).Cast<object>().ToArray()); 

    if(selIndex >= listBox.Items.Count) 
     throw new ArgumentException("SelectedIndex must be lower than ListBox.Items.Count"); 

    listBox.SelectedIndex = selIndex; 
} 

Как использовать:

PopulateListBox<EnumThree>(lstThree, true, 0); 
+0

+1 для проверки, является ли общий тип Enum – wudzik

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