2012-01-17 21 views
17

Duplicar posible:
Cast int to Enum in C#¿Es posible convertir enteros a enum?

me dio la siguiente enumeración:

public enum detallistaDocumentStatus { 

    /// <remarks/> 
    ORIGINAL, 

    /// <remarks/> 
    COPY, 

    /// <remarks/> 
    REEMPLAZA, 

    /// <remarks/> 
    DELETE, 
} 

me dieron entonces una propiedad de clase de tipo detallistaDocumentStatus:

public detallistaDocumentStatus documentStatus { 
     get { 
      return this.documentStatusField; 
     } 
     set { 
      this.documentStatusField = value; 
     } 
    } 

En la vida real, el usuario nos enviará un número (1, 2, 3 o 4) que representa cada valor enum en el orden en que se declaran.

Entonces, ¿es posible lanzar así?

det.documentStatus = (detallistaDocumentStatus)3; 

si no, ¿cómo podría obtener el valor de enumeración utilizando un entero como un índice, estamos utilizando una gran cantidad de enumeraciones, por lo que queremos hacer algo genérico y reutilizable

+4

Asignaría explícitamente valores a sus valores de enumeración si planea usar esto de esta manera. – Yuck

+20

Voy a comenzar a hacer que este sea mi comentario predeterminado: ¿Lo has intentado? Si es así, ¿qué pasó? –

+2

Las preguntas para votar como esta me desconciertan. –

Respuesta

41

sí, es posible colar Enum a int y viceversa, porque cada Enum es en realidad representado por un int por defecto. Debe especificar manualmente los valores de los miembros. Por defecto, comienza de 0 a N.

También es posible convertir Enum en y viceversa.

public enum MyEnum 
{ 
    Value1 = 1, 
    Value2 = 2, 
    Value3 = 3 
} 

private static void Main(string[] args) 
{ 
    int enumAsInt = (int)MyEnum.Value2; //enumAsInt == 2 

    int myValueToCast = 3; 
    string myValueAsString = "Value1"; 
    MyEnum myValueAsEnum = (MyEnum)myValueToCast; // Will be Value3 

    MyEnum myValueAsEnumFromString; 
    if (Enum.TryParse<MyEnum>(myValueAsString, out myValueAsEnumFromString)) 
    { 
     // Put logic here 
     // myValueAsEnumFromString will be Value1 
    } 

    Console.ReadLine(); 
} 
+0

Suponiendo que no ha definido su enumeración como 'public enum MyEnum: long', en cuyo caso la conversión a int podría provocar el truncamiento. –

+0

Es cierto. Lo mismo para uint/ulong. – ken2k

+0

Dado que el título de la pregunta es sobre la conversión de enum a int, y la respuesta marcada no incluía eso como parte del ejemplo del código, lo agregué. – AaronLS

13

Sí, es posible. Yo uso el siguiente ENUM

public enum AccountTypes 
{ 
    Proposed = 1, 
    Open = 2 
} 

luego, cuando me llamo Lo utilizo para obtener el valor:

(int)AccountTypes.Open 

y ha de devolver el valor int que necesito que por lo anterior será de 2.

+2

OP intenta ir por el otro camino. Tiene un valor entero y necesita encontrar el valor enum correspondiente. – Yuck

+0

ah, ya lo veo, gracias por señalarlo. Esto aún se puede usar para ver si el valor enviado es igual al valor de la enumeración – Taryn

-1

ENUM son solo una manera conveniente de nombrar enteros. Los valores de un ENUM se pueden agregar, restar y comparar de la misma manera que un int.

1
det.documentStatus = (detallistaDocumentStatus)3; 

Lo anterior debería funcionar bien. Lo único que hay que recordar aquí es que si se asignan números específicos a los miembros de enum, algo así podría no funcionar como se esperaba. Además, si no está numerando explícitamente sus valores enum, entonces los miembros enum comienzan en un índice basado en cero.

Así que el código anterior asignaría el 4º miembro de la enumeración en el orden de declaración.

Para comprobar si un número entero dado es un valor de enumeración válida para esa enumeración utilizar Enum.IsDefined

1

Si usted le da un valor entero explícita para los miembros de su enumeración, así:

public enum Foo 
{ 
    Five=5 
    , Six 
    , Seven 
    , Eight 
} 

simplemente Puedes lanzar a un int para obtener el valor implícito.

var bar = (int)Foo.Six: /// bar == 6 

Si no se define explícitamente un valor de al menos la primera, se convierte para un int le dará el orden en que aparece en la declaración.

10

partir de la especificación C# 4.0:

1.10 Enums

valores de enumeración se pueden convertir a valores integrales y viceversa utilizando tipo yesos. Por ejemplo

int i = (int)Color.Blue;  // int i = 2; 
Color c = (Color)2;    // Color c = Color.Blue; 

Una cosa adicional a tener en cuenta es que está autorizado a emitir cualquier valor entero en el rango de tipo subyacente de la enumeración (por defecto que es int), incluso si ese valor no lo hace mapa a uno de los nombres en la declaración enum. De 1.10 Enumeraciones:

El conjunto de valores que puede adoptar un tipo de enumeración no está limitado por sus enumeradores. En particular, cualquier valor del tipo subyacente de una enumeración se puede convertir al tipo de enumeración y es un valor válido distinto de ese tipo de enumeración.

Por lo tanto, también se admite lo siguiente con la enumeración en su ejemplo:

det.documentStatus = (detallistaDocumentStatus) 42; 

a pesar de que no hay nombre de enumeración que tiene el valor 42.

Cuestiones relacionadas