2009-02-03 54 views
8

Como una continuación de this question.C# Enumeración Parámetros de la función

¿Cómo puedo llamar a una función y pasar de una enumeración?

Por ejemplo tengo el siguiente código:

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

} 

Aunque cuando hago esto estoy consiguiendo el 'e1' es un 'tipo', pero se utiliza como un mensaje de error 'variable'. ¿Alguna idea para ayudar?

Estoy tratando de mantener la función genérica para trabajar en cualquier Enum, ¿no solo en un tipo específico? ¿Es esto posible? ... ¿Qué le parece usar una función genérica? ¿Esto funcionaría?

+0

@TK, vea mi reciente edición de typesafe. –

+0

Me gustaría una explicación _por qué_ quieres hacer esto. Para mí, parece que intentas encontrar una solución para un problema que no existiría si replanteas tu enfoque de unos pocos pasos antes, por lo que una explicación podría ayudar a encontrar una solución para el problema real. – dbemerlin

Respuesta

9

Se puede utilizar una función genérica:

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

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

y llame como:

myFunc<e1>(); 

(EDIT)

El compilador se queja si se intenta a la restricción T a Enum o enum.

Por lo tanto, para garantizar la seguridad de tipos, puede cambiar su función a:

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

usted está tratando de pasar el tipo de la enumeración como una instancia de ese tipo - intentar algo como esto:

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

Soy consciente de que puedo pasar por alto valores individuales como este. Estoy buscando pasar un Enum genérico a una función para decir imprimir todos los valores, no solo uno. –

+0

Esto imprimirá todos los valores. Use Enum.GetNames (e.GetType()). –

9

Por qué no pasar el tipo? gustan:

myfunc(typeof(e1)); 

public void myFunc(Type t) 
{ 
} 
+0

si uso "if (e Enum)" o la declaración 'como', entonces aparece el error "No se puede convertir el tipo 'System.Type' en 'System.Enum' a través de una conversión de referencia, conversión de boxeo, conversión de unboxing, envolviendo la conversión, o la conversión de tipo nulo " –

+0

Todavía puede usar Enum.GetNames (t) –

+0

¿Cómo podría escribir con seguridad esto para asegurar que las enumeraciones de ony se usan en lugar de cualquier tipo? –

0

Uso

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

en lugar de

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

Estaba tratando de mantener la función genérica para trabajar en cualquier Enum, ¿no solo en un tipo específico? –

Cuestiones relacionadas