Convierta una enumeración en List <string>

102

¿Cómo convierto la siguiente enumeración en una lista de cadenas?

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

No pude encontrar esta pregunta exacta, este Enum to List es el más cercano, pero quiero específicamenteList<string>

Jeremy Thompson
fuente

Respuestas:

177

Utilice Enumel método estático de GetNames. Devuelve un string[], así:

Enum.GetNames(typeof(DataSourceTypes))

Si desea crear un método que solo haga esto para un solo tipo de enumy también convierta esa matriz en a List, puede escribir algo como esto:

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

Necesitará Using System.Linq;en la parte superior de su clase para usar .ToList ()

DCShannon
fuente
7
@DCShannon por favor no edite preguntas / respuestas populares y reduzca explicaciones. Si bien usted y yo entendemos el código abreviado, los novatos necesitan todos los detalles adicionales para asociarlo con sus aprendizajes .
Jeremy Thompson
¿Parece Enum.GetNames(typeof(DataSourceTypes))devolver un genérico en System.Arraylugar de una matriz de cadenas?
sookie
@sookie, vea el enlace de msdn, esta es la firma del método GetNames () :public static string[] GetNames
Jeremy Thompson
30

Quiero agregar otra solución: en mi caso, necesito usar un grupo Enum en una lista de elementos de botón desplegable. Por lo tanto, podrían tener espacio, es decir, se necesitan descripciones más fáciles de usar:

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

En una clase de ayuda (HelperMethods) creé el siguiente 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();
    }

Cuando llame a este asistente, obtendrá la lista de descripciones de elementos.

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

ADICIÓN: En cualquier caso, si desea implementar este método, necesita: Extensión GetDescription para enum. Esto es lo que utilizo.

 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
fuente