2010-11-19 8 views

Respuesta

9

En C# enum s no son solo números. Más bien, son números asociados con el tipo o número con un nombre en un contexto.

Para evitar moldes en case declaraciones, se puede hacer un molde en switch:

switch((ViewBy)Convert.ToInt32(uxView.SelectedValue)) 

Esto, sin embargo, tiene sus propios problemas. Por ejemplo, este fragmento de código escribirá 7 en la consola.

enum ViewBy 
{ 
    ChuckNorris = 1, 
    JamesBond 
} 

Console.WriteLine((ViewBy)7); 
+0

genial ... gracias ... eso funcionó! – Martin

+4

Y sus problemas serían ¿qué?!?!? dígale –

+1

@ jordan.peoples Vea mi actualización, si todavía está interesado. Mejor tarde que nunca, eh :) –

4

Debe convertir el valor de cadena en una enumeración usando Enum.Parse.

ViewBy selected = (ViewBy) Enum.Parse(typeof(ViewBy), uxView.SelectedValue);   
switch (selected) 
{ 
    case ViewBy.Client: 
    // etc. 
} 

Además, el tipo subyacente de una enumeración no tiene que ser necesariamente Int32.

2

Enums son NOints en el sistema de tipos .NET!
El marco de las almacena con la ayuda de valores enteros discretos - eso es una cosa diferente ...

Thomas

2

De MSDN:

switch (expression) 
     case constant-expression : statement 
    [default : statement] 

La constante-expresión en cada caso la etiqueta se convierte al tipo de expresión y se compara con la expresión para la igualdad. El control pasa a la instrucción cuyo caso constante-expresión coincide con el valor de la expresión.

No hay una conversión implícita de enum a int, por lo que cada uno de sus case requiere una conversión explícita. Sin embargo, tenga en cuenta que inicialmente activar una expresión del tipo correcto tendría más sentido que la conversión de cada caso (consulte Enum.Parse).

0

Supongo que en tal caso parece un poco cojo, teniendo la conversión para un int y todo.

Suponiendo que había pasado un int, y no una enumeración, a ese método, tenga en cuenta:

  1. ¿Se va a documentar que lo suficientemente bien como para que cualquier momento el futuro de la ONU que será capaz de arreglar o mejorar el sistema?
  2. ¿Esta enumeración no se usa en otro lado?(Un patrón sobre cómo lidiar con esa misma información es la clave para no cometer errores de juniors o perderse a sí mismo.)

Si la respuesta es que ambos no, entonces debe considerar mantenerlo por el bien de su propia cordura, en un futuro cercano.

Y, por cierto, es más fácil de convertir a int y tener que compararlo con otra int, que con una cadena, por ejemplo.

0

En respuesta a la pregunta "¿Puede alguien decirme por qué tengo que echar a Int de mi enumeración" ....

Tienes que echar a un entero porque un enumeraciones valores no son números enteros. Los mensajes tienen un valor subyacente que se puede almacenar como un tipo integral (el valor predeterminado es int).

Se puede determinar el tipo subyacente con

Enum.GetUnderlyingType(typeof(ViewBy)); 

Puede encontrar más detalles here y here

0

¿Por qué necesitaría un molde a int en absoluto? Si uxView.SelectedValue es una enumeración de ViewBy, simplemente (ViewBy) uxView.SelectedValue sería suficiente, ¿verdad?

+0

Parece que 'SelectedValue' es una 'cadena' aquí –

Cuestiones relacionadas