2009-02-03 22 views
8

jako kontynuacją this question.C# Enum Funkcja Parametry

Jak można wywołać funkcję i przechodzą w enum?

Na przykład mam następujący kod:

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! 
    } 

} 

Chociaż kiedy to ja otrzymuję „e1” jest „typ”, ale jest używany jako „zmienną” Komunikat o błędzie zrobić. Wszelkie pomysły na pomoc?

Próbuję zachować funkcję generic do pracy na dowolnym Enum nie tylko określonego typu? Czy to jest nawet możliwe? ... A może użyć ogólnej funkcji? czy to działa?

+0

@TK zobacz moją niedawną edycji dla typesafe. –

+0

Chciałbym wyjaśnienie, dlaczego chcesz to zrobić. Dla mnie wygląda na to, że próbujesz znaleźć rozwiązanie problemu, który nie istniałby, gdybyś ponownie przemyślał swój aproach od kilku kroków, więc wyjaśnienie może pomóc w znalezieniu rozwiązania dla prawdziwego problemu. – dbemerlin

Odpowiedz

9

Można użyć rodzajowe funkcji:

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

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

i zadzwoń jak:

myFunc<e1>(); 

(EDIT)

Kompilator narzeka jeśli spróbujesz ograniczenie T do Enum lub enum.

Tak więc, aby zapewnić bezpieczeństwo typu, można zmienić funkcję:

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

Próbujesz przekazać typ wyliczenia jako przykład tego typu - spróbuj coś takiego:

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

Mam świadomość, że mogę ominąć poszczególne wartości w ten sposób. Czekam na przekazanie ogólnej nazwy Enum do funkcji, która mówi, wydrukuj wszystkie wartości, nie tylko jedną. –

+0

Spowoduje to wydrukowanie wszystkich wartości. Użyj Enum.GetNames (e.GetType()). –

9

Dlaczego nie przechodzącego typ? lubię:

myfunc(typeof(e1)); 

public void myFunc(Type t) 
{ 
} 
+0

jeśli używam wyrażenia "if (e is Enum)" lub "as", pojawia się błąd "Nie można dokonać konwersji typu" System.Type "na" System.Enum "poprzez konwersję referencyjną, konwersję boksu, konwersję rozpakowywania, konwersja owijająca lub konwersja typu null " –

+0

Nadal można używać Enum.GetNames (t) –

+0

W jaki sposób mogę to wpisać, aby upewnić się, że zamiast dowolnego typu używane są wyliczenia ony? –

0

Użyj

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

zamiast

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

Próbowałem zachować funkcję generic do pracy na dowolnym Enum nie tylko określonego typu? –