Converta um enum para List <string>

102

Como faço para converter o seguinte Enum em uma lista de strings?

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

Não consegui encontrar esta pergunta exata, este Enum para Listar é o mais próximo, mas quero especificamenteList<string>

Jeremy Thompson
fonte

Respostas:

177

Use Enumo método estático de GetNames,. Ele retorna um string[], assim:

Enum.GetNames(typeof(DataSourceTypes))

Se você deseja criar um método que faz isso apenas para um tipo de enume também converte esse array em um List, você pode escrever algo assim:

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

Você precisará estar Using System.Linq;no topo da classe para usar .ToList ()

DCShannon
fonte
7
@DCShannon, por favor, não edite perguntas / respostas populares e explicações reduzidas. Embora você e eu entendamos o código abreviado, o novato precisa de todos os detalhes extras para associá- lo ao aprendizado .
Jeremy Thompson
Parece Enum.GetNames(typeof(DataSourceTypes))retornar um genérico em System.Arrayvez de uma matriz de string?
sookie
@sookie, veja o link do msdn , esta é a assinatura do método GetNames () :public static string[] GetNames
Jeremy Thompson
30

Quero adicionar outra solução: no meu caso, preciso usar um grupo Enum em uma lista de itens de botão suspenso. Portanto, eles podem ter espaço, ou seja, são necessárias descrições mais amigáveis ​​ao usuário:

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

Em uma classe auxiliar (HelperMethods), criei o seguinte método:

 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();
    }

Ao ligar para este ajudante, você obterá a lista de descrições dos itens.

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

ADIÇÃO: Em qualquer caso, se você deseja implementar este método, você precisa: Extensão GetDescription para enum. É isso que eu uso.

 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
fonte