Przekonwertuj wyliczenie na List <string>

102

Jak przekonwertować następujące wyliczenie na listę ciągów?

[Flags]
public enum DataSourceTypes
{
    None = 0,
    Grid = 1,
    ExcelFile = 2,
    ODBC = 4
};

Nie mogłem znaleźć tego dokładnego pytania, ten wyliczenie do listy jest najbliższy, ale specjalnie chcęList<string>

Jeremy Thompson
źródło

Odpowiedzi:

177

Zastosowanie Enummetody statyczne „s, GetNames. Zwraca string[]tak:

Enum.GetNames(typeof(DataSourceTypes))

Jeśli chcesz utworzyć metodę, która robi to tylko dla jednego typu enum, a także konwertuje tę tablicę na a List, możesz napisać coś takiego:

public List<string> GetDataSourceTypes()
{
    return Enum.GetNames(typeof(DataSourceTypes)).ToList();
}

Będziesz potrzebować Using System.Linq;na szczycie swojej klasy, aby użyć .ToList ()

DCShannon
źródło
7
@DCShannon, prosimy nie edytować popularnych pytań / odpowiedzi i zmniejszać wyjaśnienia. Chociaż ty i ja rozumiemy kod skrócony, nowicjusze potrzebują wszystkich dodatkowych szczegółów, aby powiązać go z ich wiedzą .
Jeremy Thompson
Wygląda na to, że Enum.GetNames(typeof(DataSourceTypes))zwraca ogólną System.Arrayzamiast tablicy ciągów?
sookie
@sookie, zobacz link msdn, to jest podpis metody GetNames () :public static string[] GetNames
Jeremy Thompson,
30

Chcę dodać inne rozwiązanie: w moim przypadku potrzebuję grupy Enum na liście rozwijanej z przyciskami. Więc mogą mieć miejsce, czyli potrzebne są bardziej przyjazne dla użytkownika opisy:

  public enum CancelReasonsEnum
{
    [Description("In rush")]
    InRush,
    [Description("Need more coffee")]
    NeedMoreCoffee,
    [Description("Call me back in 5 minutes!")]
    In5Minutes
}

W klasie pomocniczej (HelperMethods) utworzyłem następującą metodę:

 public static List<string> GetListOfDescription<T>() where T : struct
    {
        Type t = typeof(T);
        return !t.IsEnum ? null : Enum.GetValues(t).Cast<Enum>().Select(x => x.GetDescription()).ToList();
    }

Gdy zadzwonisz do tego pomocnika, otrzymasz listę opisów przedmiotów.

 List<string> items = HelperMethods.GetListOfDescription<CancelReasonEnum>();

DODATEK: W każdym przypadku, jeśli chcesz zaimplementować tę metodę, potrzebujesz: rozszerzenia GetDescription dla enum. To jest to, czego używam.

 public static string GetDescription(this Enum value)
    {
        Type type = value.GetType();
        string name = Enum.GetName(type, value);
        if (name != null)
        {
            FieldInfo field = type.GetField(name);
            if (field != null)
            {
                DescriptionAttribute attr =Attribute.GetCustomAttribute(field,typeof(DescriptionAttribute)) as DescriptionAttribute;
                if (attr != null)
                {
                    return attr.Description;
                }
            }
        }
        return null;
        /* how to use
            MyEnum x = MyEnum.NeedMoreCoffee;
            string description = x.GetDescription();
        */

    }
rkmorgan
źródło