2009-04-29 10 views
3

Je veux créer une méthode qui accepte un type Enum, et renvoie toute l'énumération à l'intérieur d'un tableau, comment créer une telle fonction?Obtenir toutes les valeurs d'énumération

Prenez par exemple, j'ai deux énumérations:

public enum Family 
{ 
    Brother, 
    Sister, 
    Father 
} 

public enum CarType 
{ 
    Volkswagen, 
    Ferrari, 
    BMW 
} 

Comment créer une fonction GetEnumList afin qu'elle retourne

  1. {Family.Brother, Family.Sister, Family.Father} pour le premier cas.
  2. {CarType.Volkswagen, CarType.Ferrari, CarType.BMW} pour le second cas.

J'ai essayé:

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

mais je me suis un InvalidOperationException:

System.InvalidOperationException : Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true. 
    at System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException() 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 

Edit: Le code ci-dessus fonctionne fine-- la raison pour laquelle je suis une exception a été parce que profileur a causé moi le bug. Merci à tous pour votre solution.

+0

Cela a bien fonctionné pour moi - pouvez-vous poster le code appelant? – RobS

+0

Oui, ça marche bien - J'ai trouvé que mon profileur me causait un bug et donc l'exception. – Graviton

Répondre

12

Voici le code complet:

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; 
    } 
4
(Family[])Enum.GetValues(typeof(Family)) 
+0

Merci, mais je veux une méthode générale qui accepte le type enum et renvoie la liste respective, mais une fonction de distribution spécifique. – Graviton

2

Comme cela?

private static List<string> GetEnumList<T>() 
{ 
    return Enum.GetNames(typeof(T)) 
      .Select(s => typeof(T).Name + "." + s).ToList(); 
} 
Questions connexes