2008-09-30 17 views

Odpowiedz

26
string[] names = Enum.GetNames (typeof(MyEnum)); 

Następnie wystarczy wypełnić listy rozwijanej witka tablicę

0

Jest to często przydatne do określenia MIN i MAX wewnątrz enum, który zawsze będzie pierwszym i ostatnie przedmioty. Oto bardzo prosty przykład przy użyciu składni Delphi:

procedure TForm1.Button1Click(Sender: TObject); 
type 
    TEmployeeTypes = (etMin, etHourly, etSalary, etContractor, etMax); 
var 
    i : TEmployeeTypes; 
begin 
    for i := etMin to etMax do begin 
    //do something 
    end; 
end; 
+0

Poza tym, że nie ma takiej samej składni C#, więc inne przykłady są prawdopodobnie lepsze! Osobiście nie wydaje mi się, aby kombinacja min/max była wyliczana, gdybym definiował sygnalizację świetlną, chcę mieć kolor czerwony, bursztynowy, zielony nie min., Czerwony, bursztynowy, zielony, min. –

+0

Erm ... ... Green, Max. (oops) –

5

Można iterację tablicy zwróconej przez Enum.GetNames method zamiast.

public class GetNamesTest { 
enum Colors { Red, Green, Blue, Yellow }; 
enum Styles { Plaid, Striped, Tartan, Corduroy }; 

public static void Main() { 

    Console.WriteLine("The values of the Colors Enum are:"); 
    foreach(string s in Enum.GetNames(typeof(Colors))) 
     Console.WriteLine(s); 

    Console.WriteLine(); 

    Console.WriteLine("The values of the Styles Enum are:"); 
    foreach(string s in Enum.GetNames(typeof(Styles))) 
     Console.WriteLine(s); 
} 
} 
10

Użyj metody Enum.GetValues:

foreach (TestEnum en in Enum.GetValues(typeof(TestEnum))) 
{ 
    ... 
} 

Nie musisz oddać je do łańcucha, i w ten sposób można tylko pobierać je z powrotem, oddając właściwość SelectedItem do TestEnum wartości również bezpośrednio.

3

Jeśli potrzebujesz wartości combo odpowiadać wartościom wyliczenia można również użyć czegoś takiego:

foreach (TheEnum value in Enum.GetValues(typeof(TheEnum))) 
    dropDown.Items.Add(new ListItem(
     value.ToString(), ((int)value).ToString() 
    ); 

W ten sposób można pokazać teksty w rozwijanym i otrzymać z powrotem value (in SelectedValue property)

24

Wiem, że inni już odpowiedzieli poprawną odpowiedzią, jednak jeśli chcesz używać wyliczeń w polu złożonym, możesz chcieć przejść dodatkowe miejsce i powiązać łańcuchy do enum, aby można było podać więcej szczegółów w wyświetlanym ciągu (np. spacje między słowami lub ciągi wyświetlania przy użyciu obudowy, która to robi esn't dopasować standardów kodowania)

Ten wpis blogu mogą być użyteczne - Associating Strings with enums in c#

public enum States 
{ 
    California, 
    [Description("New Mexico")] 
    NewMexico, 
    [Description("New York")] 
    NewYork, 
    [Description("South Carolina")] 
    SouthCarolina, 
    Tennessee, 
    Washington 
} 

Jako bonus, on dostarczany jest również sposób narzędzie służące do wyliczania wyliczenie, że mam teraz zaktualizowaną z Jon Skeet na komentuje

public static IEnumerable<T> EnumToList<T>() 
    where T : struct 
{ 
    Type enumType = typeof(T); 

    // Can't use generic type constraints on value types, 
    // so have to do check like this 
    if (enumType.BaseType != typeof(Enum)) 
     throw new ArgumentException("T must be of type System.Enum"); 

    Array enumValArray = Enum.GetValues(enumType); 
    List<T> enumValList = new List<T>(); 

    foreach (T val in enumValArray) 
    { 
     enumValList.Add(val.ToString()); 
    } 

    return enumValList; 
} 

Jon zauważył również, że w C# 3.0 można uprościć do czegoś takiego (który jest teraz coraz tak lekki, że bym sobie wyobrazić można po prostu zrobić to w jednej linii):

public static IEnumerable<T> EnumToList<T>() 
    where T : struct 
{ 
    return Enum.GetValues(typeof(T)).Cast<T>(); 
} 

// Using above method 
statesComboBox.Items = EnumToList<States>(); 

// Inline 
statesComboBox.Items = Enum.GetValues(typeof(States)).Cast<States>(); 
+0

@Ray - Chciałbym zamieścić link do tego samego wpisu na blogu :-) Użyłem jego narzędzia wiele razy i działa jak urok! –

+1

Kilka ulepszeń (może zająć kilka komentarzy, obawiam się): 1) Metoda może dodać ograniczenie "gdzie T: struct", aby zmniejszyć prawdopodobieństwo wystąpienia ArgumentException (choć nadal jest to możliwe). 2) Foreach może używać "foreach (T val in enumValArray)" zamiast formatowania, a następnie reparacji. –

+0

Jeśli korzystasz z .NET 3.5, można to zrobić po prostu: return Enum.GetValues ​​(typeof (T)) Cast (); To nie przeszkadza budować listę, albo :) –

0

Nieco bardziej "skomplikowana" (może przesada), ale używam tych dwóch metod, aby zwracać słowniki do wykorzystania jako źródła danych. Pierwsza zwraca nazwę jako klucz, a druga wartość jako klucz.

 
public static IDictionary<string, int> ConvertEnumToDictionaryNameFirst<K>() 
{ 
    if (typeof(K).BaseType != typeof(Enum)) 
    { 
    throw new InvalidCastException(); 
    } 

    return Enum.GetValues(typeof(K)).Cast<int>().ToDictionary(currentItem 
    => Enum.GetName(typeof(K), currentItem)); 
} 

Albo można zrobić

 

public static IDictionary<int, string> ConvertEnumToDictionaryValueFirst<K>() 
{ 
    if (typeof(K).BaseType != typeof(Enum)) 
    { 
    throw new InvalidCastException(); 
    } 

    return Enum.GetNames(typeof(K)).Cast<string>().ToDictionary(currentItem 
    => (int)Enum.Parse(typeof(K), currentItem)); 
} 

Zakłada używasz 3.5 chociaż. Trzeba będzie zastąpić wyrażenia lambda, jeśli nie.

Zastosowanie:

 

    Dictionary list = ConvertEnumToDictionaryValueFirst<SomeEnum>(); 

 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
1

Problem z użyciem teksty stałe do zapełniania upadki ciągnąć cann't że masz dziwne znaki lub spacje w teksty stałe. Mam kod, który rozszerza wyliczenia, dzięki czemu można dodać dowolny znak, który chcesz.

Używaj go tak .. dane

public enum eCarType 
{ 
     [StringValue("Saloon/Sedan")] Saloon = 5, 
     [StringValue("Coupe")] Coupe = 4, 
     [StringValue("Estate/Wagon")] Estate = 6, 
     [StringValue("Hatchback")] Hatchback = 8, 
     [StringValue("Utility")] Ute = 1, 
} 

Bind jak tak ..

StringEnum CarTypes = new StringEnum(typeof(eCarTypes)); 
cmbCarTypes.DataSource = CarTypes.GetGenericListValues(); 

Oto klasa, która rozszerza enum.

// Author: Donny V. // blog: http://donnyvblog.blogspot.com

using System; 
    using System.Collections; 
    using System.Collections.Generic; 
    using System.Reflection; 

namespace xEnums 
{ 

    #region Class StringEnum 

    /// <summary> 
    /// Helper class for working with 'extended' enums using <see cref="StringValueAttribute"/> attributes. 
    /// </summary> 
    public class StringEnum 
    { 
     #region Instance implementation 

     private Type _enumType; 
     private static Hashtable _stringValues = new Hashtable(); 

     /// <summary> 
     /// Creates a new <see cref="StringEnum"/> instance. 
     /// </summary> 
     /// <param name="enumType">Enum type.</param> 
     public StringEnum(Type enumType) 
     { 
      if (!enumType.IsEnum) 
       throw new ArgumentException(String.Format("Supplied type must be an Enum. Type was {0}", enumType.ToString())); 

      _enumType = enumType; 
     } 

     /// <summary> 
     /// Gets the string value associated with the given enum value. 
     /// </summary> 
     /// <param name="valueName">Name of the enum value.</param> 
     /// <returns>String Value</returns> 
     public string GetStringValue(string valueName) 
     { 
      Enum enumType; 
      string stringValue = null; 
      try 
      { 
       enumType = (Enum) Enum.Parse(_enumType, valueName); 
       stringValue = GetStringValue(enumType); 
      } 
      catch (Exception) { }//Swallow! 

      return stringValue; 
     } 

     /// <summary> 
     /// Gets the string values associated with the enum. 
     /// </summary> 
     /// <returns>String value array</returns> 
     public Array GetStringValues() 
     { 
      ArrayList values = new ArrayList(); 
      //Look for our string value associated with fields in this enum 
      foreach (FieldInfo fi in _enumType.GetFields()) 
      { 
       //Check for our custom attribute 
       StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof (StringValueAttribute), false) as StringValueAttribute[]; 
       if (attrs.Length > 0) 
        values.Add(attrs[0].Value); 

      } 

      return values.ToArray(); 
     } 

     /// <summary> 
     /// Gets the values as a 'bindable' list datasource. 
     /// </summary> 
     /// <returns>IList for data binding</returns> 
     public IList GetListValues() 
     { 
      Type underlyingType = Enum.GetUnderlyingType(_enumType); 
      ArrayList values = new ArrayList(); 
      //List<string> values = new List<string>(); 

      //Look for our string value associated with fields in this enum 
      foreach (FieldInfo fi in _enumType.GetFields()) 
      { 
       //Check for our custom attribute 
       StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof (StringValueAttribute), false) as StringValueAttribute[]; 
       if (attrs.Length > 0) 
        values.Add(new DictionaryEntry(Convert.ChangeType(Enum.Parse(_enumType, fi.Name), underlyingType), attrs[0].Value)); 

      } 

      return values; 

     } 

     /// <summary> 
     /// Gets the values as a 'bindable' list<string> datasource. 
     ///This is a newer version of 'GetListValues()' 
     /// </summary> 
     /// <returns>IList<string> for data binding</returns> 
     public IList<string> GetGenericListValues() 
     { 
      Type underlyingType = Enum.GetUnderlyingType(_enumType); 
      List<string> values = new List<string>(); 

      //Look for our string value associated with fields in this enum 
      foreach (FieldInfo fi in _enumType.GetFields()) 
      { 
       //Check for our custom attribute 
       StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[]; 
       if (attrs.Length > 0) 
        values.Add(attrs[0].Value); 
      } 

      return values; 

     } 

     /// <summary> 
     /// Return the existence of the given string value within the enum. 
     /// </summary> 
     /// <param name="stringValue">String value.</param> 
     /// <returns>Existence of the string value</returns> 
     public bool IsStringDefined(string stringValue) 
     { 
      return Parse(_enumType, stringValue) != null; 
     } 

     /// <summary> 
     /// Return the existence of the given string value within the enum. 
     /// </summary> 
     /// <param name="stringValue">String value.</param> 
     /// <param name="ignoreCase">Denotes whether to conduct a case-insensitive match on the supplied string value</param> 
     /// <returns>Existence of the string value</returns> 
     public bool IsStringDefined(string stringValue, bool ignoreCase) 
     { 
      return Parse(_enumType, stringValue, ignoreCase) != null; 
     } 

     /// <summary> 
     /// Gets the underlying enum type for this instance. 
     /// </summary> 
     /// <value></value> 
     public Type EnumType 
     { 
      get { return _enumType; } 
     } 

     #endregion 

     #region Static implementation 

     /// <summary> 
     /// Gets a string value for a particular enum value. 
     /// </summary> 
     /// <param name="value">Value.</param> 
     /// <returns>String Value associated via a <see cref="StringValueAttribute"/> attribute, or null if not found.</returns> 
     public static string GetStringValue(Enum value) 
     { 
      string output = null; 
      Type type = value.GetType(); 

      if (_stringValues.ContainsKey(value)) 
       output = (_stringValues[value] as StringValueAttribute).Value; 
      else 
      { 
       //Look for our 'StringValueAttribute' in the field's custom attributes 
       FieldInfo fi = type.GetField(value.ToString()); 
       StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof (StringValueAttribute), false) as StringValueAttribute[]; 
       if (attrs.Length > 0) 
       { 
        _stringValues.Add(value, attrs[0]); 
        output = attrs[0].Value; 
       } 

      } 
      return output; 

     } 

     /// <summary> 
     /// Parses the supplied enum and string value to find an associated enum value (case sensitive). 
     /// </summary> 
     /// <param name="type">Type.</param> 
     /// <param name="stringValue">String value.</param> 
     /// <returns>Enum value associated with the string value, or null if not found.</returns> 
     public static object Parse(Type type, string stringValue) 
     { 
      return Parse(type, stringValue, false); 
     } 

     /// <summary> 
     /// Parses the supplied enum and string value to find an associated enum value. 
     /// </summary> 
     /// <param name="type">Type.</param> 
     /// <param name="stringValue">String value.</param> 
     /// <param name="ignoreCase">Denotes whether to conduct a case-insensitive match on the supplied string value</param> 
     /// <returns>Enum value associated with the string value, or null if not found.</returns> 
     public static object Parse(Type type, string stringValue, bool ignoreCase) 
     { 
      object output = null; 
      string enumStringValue = null; 

      if (!type.IsEnum) 
       throw new ArgumentException(String.Format("Supplied type must be an Enum. Type was {0}", type.ToString())); 

      //Look for our string value associated with fields in this enum 
      foreach (FieldInfo fi in type.GetFields()) 
      { 
       //Check for our custom attribute 
       StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof (StringValueAttribute), false) as StringValueAttribute[]; 
       if (attrs.Length > 0) 
        enumStringValue = attrs[0].Value; 

       //Check for equality then select actual enum value. 
       if (string.Compare(enumStringValue, stringValue, ignoreCase) == 0) 
       { 
        output = Enum.Parse(type, fi.Name); 
        break; 
       } 
      } 

      return output; 
     } 

     /// <summary> 
     /// Return the existence of the given string value within the enum. 
     /// </summary> 
     /// <param name="stringValue">String value.</param> 
     /// <param name="enumType">Type of enum</param> 
     /// <returns>Existence of the string value</returns> 
     public static bool IsStringDefined(Type enumType, string stringValue) 
     { 
      return Parse(enumType, stringValue) != null; 
     } 

     /// <summary> 
     /// Return the existence of the given string value within the enum. 
     /// </summary> 
     /// <param name="stringValue">String value.</param> 
     /// <param name="enumType">Type of enum</param> 
     /// <param name="ignoreCase">Denotes whether to conduct a case-insensitive match on the supplied string value</param> 
     /// <returns>Existence of the string value</returns> 
     public static bool IsStringDefined(Type enumType, string stringValue, bool ignoreCase) 
     { 
      return Parse(enumType, stringValue, ignoreCase) != null; 
     } 

     #endregion 
    } 

    #endregion 

    #region Class StringValueAttribute 

    /// <summary> 
    /// Simple attribute class for storing String Values 
    /// </summary> 
    public class StringValueAttribute : Attribute 
    { 
     private string _value; 

     /// <summary> 
     /// Creates a new <see cref="StringValueAttribute"/> instance. 
     /// </summary> 
     /// <param name="value">Value.</param> 
     public StringValueAttribute(string value) 
     { 
      _value = value; 
     } 

     /// <summary> 
     /// Gets the value. 
     /// </summary> 
     /// <value></value> 
     public string Value 
     { 
      get { return _value; } 
     } 
    } 

    #endregion 
} 

1

.NET 3.5 upraszcza stosując metody rozszerzenia:

enum Color {Red, Green, Blue} 

Czy należy powtórzyć z

Enum.GetValues(typeof(Color)).Cast<Color>() 

lub zdefiniować nową metodę statyczną Generic:

static IEnumerable<T> GetValues<T>() { 
    return Enum.GetValues(typeof(T)).Cast<T>(); 
} 

Należy pamiętać, że iteracja za pomocą metody Enum.GetValues ​​() używa odbicia i dlatego ma nałożone kary.

Powiązane problemy