2011-08-09 20 views
10

Enum'dan bir açılır liste oluşturuyorum. ( )IEnumerable'a yeni öğe ekleme

public static SelectList ToSelectList<TEnum>(this TEnum enumObj) 
    { 

     IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum)).Cast<TEnum>(); 

     var result = from TEnum e in values 
        select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() }; 

     var tempValue = new { ID = 0, Name = "-- Select --" }; 


     return new SelectList(result, "Id", "Name", enumObj); 
    } 

Ben sorun IEnumerable antoher madde eklemek etmektir. Sadece nasıl yapılacağını anlayamadım. Birisi, kodumu "--select--" değerini eklemek için değiştirebilir.

cevap

18

IEnumerable<T> nesnesini değiştiremezsiniz, yalnızca öğeleri numaralandırmak için bir arabirim sağlar. Ancak IEnumerable<T>'u List<T>'a dönüştürmek için .ToList()'u kullanabilirsiniz.

public static SelectList ToSelectList<TEnum>(this TEnum enumObj) 
{ 

    IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum)).Cast<TEnum>(); 

    var result = from TEnum e in values 
       select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() }; 

    var tempValue = new { ID = 0, Name = "-- Select --" }; 

    var list = result.ToList(); // Create mutable list 

    list.Insert(0, tempValue); // Add at beginning of list 

    return new SelectList(list, "Id", "Name", enumObj); 
} 
+0

çalıştığını dene çok teşekkür ederim. – qinking126

3

Sen bir IEnumerable değiştiremezsiniz Bu ne istediğinizi ise

emin değilim. Adından da anlaşılacağı gibi, sadece bir numaralama geçişi sağlar. Bu bir ASP.NET MVC uygulaması olduğu görülüyor. Doğru yolu ulaşmak bir açılan bu gibi DropDownFor yardımcı doğru aşırı kullanmaktır için (varsayılan bir değer ekleyin) çalışırken ne elde etmek:

@Html.DropDownListFor(
    x => x.SomeValue, 
    Model.SomeEnum.ToSelectList(), 
    "-- Select --" 
) 

Bu besbelli uzantısı yöntemi olarak olduğunu varsayar basit olarak:

public static SelectList ToSelectList<TEnum>(this TEnum enumObj) 
{ 
    var result = 
     from e in Enum.GetValues(typeof(TEnum)).Cast<TEnum>() 
     select new 
     { 
      Id = (int)Enum.Parse(typeof(TEnum), e.ToString()), 
      Name = e.ToString() 
     }; 
    return new SelectList(result, "Id", "Name", enumObj); 
} 
1

, bu

public static SelectList ToSelectList<TEnum>(this TEnum enumObj) 
    { 
    var result = (from TEnum e in Enum.GetValues(typeof(TEnum)) 
        select new 
        { 
         ID = (int) Enum.Parse(typeof(TEnum), e.ToString()), 
         Name = e.ToString() 
        }).ToList(); 

    result.Insert(0, new 
         { 
         ID = 0, 
         Name = "-- Select --" 
         }); 

    return new SelectList(result, "Id", "Name", enumObj); 
    }