Pregunta

Quiero crear un método que tome un tipo de Enum y devuelva todos sus miembros en una matriz. ¿Cómo crear una función de este tipo?

Tomemos, por ejemplo, tengo estas dos enumeraciones:

public enum Family
{ 
   Brother,
   Sister,
   Father
}

public enum CarType
{ 
   Volkswagen,
   Ferrari,
   BMW
}

Cómo crear una función GetEnumList para que se devuelva

  1. {Family.Brother, Family.Sister, Family.Father} para el primer caso.
  2. {CarType.Volkswagen, CarType.Ferrari, CarType.BMW} para el segundo caso.

Lo intenté:

private static List<T> GetEnumList<T>()
{
    var enumList = Enum.GetValues(typeof(T))
        .Cast<T>().ToList();
    return enumList;
}

Pero obtuve una InvalidOperationException :

  

System.InvalidOperationException: Las operaciones de enlace tardías no se pueden realizar en tipos o métodos para los que ContainsGenericParameters es verdadero.           en System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException ()           en System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder binder, Object [] parámetros, CultureInfo culture, Boolean skipVisibilityChecks)           en System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder binder, Object [] parameters, cultura CultureInfo)           en System.Reflection.MethodBase.Invoke (Objeto obj, Objeto [] parámetros)

Editar: El código anterior funciona bien: la razón por la que obtuve una excepción fue porque el generador de perfiles me causó el error. Gracias a todos por sus soluciones.

¿Fue útil?

Solución

Aquí está el código completo:

    public enum Family
    {
        Brother,
        Sister,
        Father
    }

    public enum CarType
    {
        Volkswagen,
        Ferrari,
        BMW
    }


    static void Main(string[] args)
    {
        Console.WriteLine(GetEnumList<Family>());
        Console.WriteLine(GetEnumList<Family>().First());
        Console.ReadKey();
    }

    private static List<T> GetEnumList<T>()
    {
        T[] array = (T[])Enum.GetValues(typeof(T));
        List<T> list = new List<T>(array);
        return list;
    }

Otros consejos

(Family[])Enum.GetValues(typeof(Family))

¿Te gusta esto?

private static List<string> GetEnumList<T>()
{
    return Enum.GetNames( typeof( T ) )
           .Select(s => typeof(T).Name + "." + s).ToList();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top