2015-05-14 2 views
0

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

foreach (LunchBreak type in Enum.GetValues(typeof(LunchBreak))) 
{ 
    items.Add(new SelectListItem() 
    { 
     Text = SiteUtilities.GetEnumDescription(type), 
     Value = ((int)type).ToString() 
    }); 
} 

Где мое перечисление в виде:

public enum LunchBreak : int 
{ 
    [Description("20 minutes paid")] 
    Paid_20 = 0, 

    [Description("20 minutes unpaid")] 
    Unpaid_20 = 1 
} 

Есть ли способ сделать что цикл Еогеасп родовым поэтому я могу перейти в typeof(LunchBreak), поэтому мне не нужно повторять код для всех остальных перечислений?

Я пробовал писать, где бы я мог просто пройти LunchBreak, но потом он пожаловался на меня, используя перечисление как Тип.

Я пытался сделать метод расширения, как здесь, так что я мог бы назвать что-то вроде LunchBreak.GetSelectListItems("Please select a lunch break...") и взглянули на несколько постов, как это: Create Generic method constraining T to an Enum, но на самом деле не получить то, что происходит

Extension попытка:

public static class EnumExtensions 
{ 
    public static List<SelectListItem> GetSelectListItems<T>(string defaultValue) where T : struct, IConvertible 
    { 
     if (typeof(T).IsEnum) 
     { 
      List<SelectListItem> items = new List<SelectListItem>() 
      { 
       new SelectListItem() 
       { 
        Text = defaultValue, 
        Value = string.Empty 
       } 
      }; 

      foreach (T item in Enum.GetValues(typeof(T))) 
      { 
       items.Add(new SelectListItem() 
       { 
        Text = SiteUtilities.GetEnumDescription(item), // this line fails as item is expected to be of type Enum 
        Value = ((int)item).ToString() // this line fails as I can't cast item as an int 
       }); 
      } 

      return items; 
     } 

     throw new ArgumentException("T must be an enumerated type"); 
    } 
} 

ответ

1

Вы почти у цели. Вам нужно отбросить его на объект, затем на Enum. Для литья до int вы можете использовать Convert.ToInt32.

public static class EnumExtensions 
{ 
    public static List<SelectListItem> GetSelectListItems<T>(string defaultValue) where T : struct, IConvertible 
    { 
     if (!typeof (T).IsEnum) 
      throw new ArgumentException("T must be an enumerated type"); 

     List<SelectListItem> items = new List<SelectListItem>() 
     { 
      new SelectListItem() 
      { 
       Text = "Please select a lunch break...", 
       Value = string.Empty 
      } 
     }; 

     foreach (T item in Enum.GetValues(typeof(T))) 
     { 
      items.Add(new SelectListItem() 
      { 
       Text = SiteUtilities.GetEnumDescription((Enum)(object)item), 
       Value = Convert.ToInt32(item).ToString() 
      }); 
     } 

     return items; 
    } 
} 

Примечание: Вы не используете параметр defaultValue вам может понадобиться, чтобы избавиться от него, и я считаю, SelectListItem.Value должен быть int иметь больше смысла.

+0

Отлично, спасибо! –

0

Нечто подобное должно делать (я не имею ни малейшего представления о GetEnumDescription прототипа - но он может просто ожидать объект и отражать его.):

public static IEnumerable<SelectListItem> GetSelectListItems<T>(string defaultValue) 
{ 
     if(!typeof(T).IsEnum) 
     throw new Exception("Not an enum"); 

     yield return new SelectListItem 
     { 
      Text = defaultValue, 
      Value = string.Empty 
     }; 

     foreach(var item in Enum.GetValues(typeof(T)) 
     { 
      yield return new SelectListItem 
      { 
       Text = SiteUtilities.GetEnumDescription((Enum)item), 
       Value = Convert.ChangeType(item, typeof(T).GetEnumUnderlyingType().ToString()) // not all enums are int's 
      } 
     } 
} 

Вы можете ToList() это с оберткой, если вам нужно ,

-1

Код ниже работает

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 


namespace ConsoleApplication28 
{ 
    class Program 
    { 
     public enum LunchBreak : int 
     { 
      Paid_20 = 0, 
      Unpaid_20 = 1, 
     } 
     static void Main(string[] args) 
     { 
      foreach (LunchBreak type in Enum.GetValues(typeof(LunchBreak))) 
      { 
       LunchBreak LunchItem = type; 

      } 

     } 
    } 
} 
0

Вот простое расширение, которое я хотел бы построить любой 'перечисление зацикливание' офф:

Extension

public static class EnumExtension 
    { 
     public static IEnumerable<T> GetValues<T>(this T e) 
     { 
      return Enum.GetValues(e.GetType()).Cast<T>(); 
     } 
} 

Использование

foreach(var t in new MyEnum().GetValues()){ 

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