2009-02-03 11 views
8

En tant que suivi à partir this question.C# Enum Fonction Paramètres

Comment puis-je appeler une fonction et passer dans un Enum?

Par exemple, j'ai le code suivant:

enum e1 
{ 
    //... 
} 

public void test() 
{ 
    myFunc(e1); 
} 

public void myFunc(Enum e) 
{ 
    var names = Enum.GetNames(e.GetType()); 

    foreach (var name in names) 
    { 
     // do something! 
    } 

} 

Bien que quand je fais ce que je reçois le « e1 » est un « type », mais est utilisé comme un message d'erreur « variable ». Des idées pour aider?

J'essaie de garder la fonction générique pour travailler sur n'importe quel Enum pas seulement un type spécifique? Est-ce encore possible? ... Que diriez-vous d'utiliser une fonction générique? cela fonctionnerait-il?

+0

@TK, voir mon édition récente pour typesafe. –

+0

Je voudrais une explication _why_ vous voulez faire cela. Pour moi, il semble que vous essayez de trouver une solution à un problème qui n'existerait pas si vous repensiez votre approche de quelques étapes auparavant, donc une explication pourrait vous aider à trouver une solution au problème réel. – dbemerlin

Répondre

9

Vous pouvez utiliser une fonction générique:

public void myFunc<T>() 
    { 
     var names = Enum.GetNames(typeof(T)); 

     foreach (var name in names) 
     { 
      // do something! 
     } 
    } 

et appeler comme:

myFunc<e1>(); 

(EDIT)

Le compilateur se plaint si vous essayez de contrainte T-Enum ou enum.

Ainsi, pour assurer la sécurité de type, vous pouvez changer votre fonction:

public static void myFunc<T>() 
    { 
     Type t = typeof(T); 
     if (!t.IsEnum) 
      throw new InvalidOperationException("Type is not Enum"); 

     var names = Enum.GetNames(t); 
     foreach (var name in names) 
     { 
      // do something! 
     } 
    } 
5

Vous essayez de passer le type de ENUM comme une instance de ce type - essayer quelque chose comme ceci:

enum e1 
{ 
    foo, bar 
} 

public void test() 
{ 
    myFunc(e1.foo); // this needs to be e1.foo or e1.bar - not e1 itself 
} 

public void myFunc(Enum e) 
{ 
    foreach (string item in Enum.GetNames(e.GetType())) 
    { 
     // Print values 
    } 
} 
+0

Je suis conscient que je peux contourner des valeurs individuelles comme celle-ci. Je cherche à passer un Enum générique à une fonction pour dire imprimer toutes les valeurs pas seulement une. –

+0

Cela va imprimer toutes les valeurs. Utilisez Enum.GetNames (e.GetType()). –

9

Pourquoi ne pas passer le type? aime:

myfunc(typeof(e1)); 

public void myFunc(Type t) 
{ 
} 
+0

si j'utilise "if (e est Enum)" ou l'instruction "as", j'obtiens une erreur "Impossible de convertir le type 'System.Type' en 'System.Enum' via une conversion de référence, une conversion de boxe, unboxing, conversion wrapping ou conversion de type null " –

+0

Vous pouvez toujours utiliser Enum.GetNames (t) –

+0

Comment est-ce que je peux sécuriser ce type de façon à ce que toutes les enums soient utilisées à la place de n'importe quel type? –

0

Utilisez

public void myFunc(e1 e) { // use enum of type e} 

au lieu de

public void myFunc(Enum e) { // use type enum. The same as class or interface. This is not generic! } 
+0

J'essayais de garder la fonction générique pour travailler sur n'importe quel Enum pas seulement un type spécifique? –