2008-09-18 11 views
14

he declarado lo siguiente enumeración:cómo obtener el valor subyacente de una enumeración

public enum TransactionTypeCode { Shipment = 'S', Receipt = 'R' } 

¿Cómo puedo obtener el valor 'S' de un TransactionTypeCode.Shipment o 'R' de TransactionTypeCode.Receipt?

Simplemente haciendo TransactionTypeCode.ToString() da una cadena del nombre Enum "Envío" o "Recibo" para que no corte la mostaza.

Respuesta

3

Prueba esto:

string value = (string)TransactionTypeCode.Shipment; 
+0

En realidad es un poco más complejo, copié el código incorrecto de mi muestra, no puede haber cadenas para valores en una enumeración.entonces la respuesta completa sería ((char) instance.Shipment), ToString() –

+3

@GeorgeMauer El "tipo subyacente" de su enumeración sigue siendo 'int', por lo que su definición realmente dice:' enum TransactionTypeCode {Shipment = 83, Receipt = 82,} '. Hay una conversión implícita de 'char' a' int', por alguna razón. El único "problema" (que podría no ser un problema) con su enumeración es que 'default (TransactionTypeCode)' no tiene un nombre, ya que ningún miembro es igual a 0 (o ''\ 0''). –

+3

Esta respuesta es categóricamente incorrecta en todos los niveles. Comience con el hecho de que no se compilará, y continúe con el hecho de que las enumeraciones no son cadenas, que los caracteres no son cadenas, y que el tipo subyacente de la enumeración no es, y no puede ser, una cadena. . –

2

Creo que Enum.GetValues ​​() es lo que estás buscando.

0

Esta es la forma general configuro mis enumeraciones:

public enum TransactionTypeCode { 

    Shipment("S"),Receipt ("R"); 

    private final String val; 

    TransactionTypeCode(String val){ 
    this.val = val; 
    } 

    public String getTypeCode(){ 
    return val; 
    } 
} 

System.out.println(TransactionTypeCode.Shipment.getTypeCode()); 
+1

Esta pregunta es para C#. – Iain

0

que estaba buscando eso y obtener la solución utilizar la clase Convert

int value = Convert.ToInt32(TransactionTypeCode.Shipment); 

ver cómo es fácil

+1

Sin olvidar que esto llama a la sobrecarga 'Convert.ToInt32 (object)', que provocará el encajamiento y, por lo tanto, será más lento. Nada de qué preocuparse, solo dicho. Más fácil para mis ojos es '(int) enumValue' siempre. – nawfal

29

usted tiene que comprobar el tipo subyacente de la enumeración y luego convertir a un tipo adecuado:

public enum SuperTasks : int 
    { 
     Sleep = 5, 
     Walk = 7, 
     Run = 9 
    } 

    private void btnTestEnumWithReflection_Click(object sender, EventArgs e) 
    { 
     SuperTasks task = SuperTasks.Walk; 
     Type underlyingType = Enum.GetUnderlyingType(task.GetType()); 
     object value = Convert.ChangeType(task, underlyingType); // x will be int 
    }  
+0

Supongo que si no conoce el tipo subyacente de la enumeración, esta sería la manera de hacerlo. Pero cómo terminarías alguna vez en esa situación me supera. –

+2

+1 Este es el último paso que necesitaba para crear automáticamente (a través de la reflexión) mi lista de valores de parámetros de SP desde un objeto de entidad. No puedo guardar la enumeración en la base de datos, así que estoy guardando el valor subyacente. – jimr

+1

El Convert.ChangeType necesita un FormatProvider, pero para las enumeraciones (que son básicamente ints), creo que puede pasar nulo. +1 por la propina @GeorgeMauer: Terminé con una situación así en SterlingDB, donde todo tipo de tipos se serializan en un archivo. Por lo tanto, un objeto se pasa al método de serialización. Si es una enumeración, serializaremos el valor entero, por lo que necesitamos el valor subyacente. – Peter

1

El tipo subyacente de su enumeración se sigue INT, sólo que hay una conversión implícita de char a int por alguna razón . Su enumeración es equivalente a

TransactionTypeCode { Shipment = 83, Receipt = 82, } 

También tenga en cuenta que enum can have any integral type as underlying type except char, probablemente por alguna razón semántica. Esto no es posible:

TransactionTypeCode : char { Shipment = 'S', Receipt = 'R', } 

para obtener el valor char atrás, sólo puede utilizar un yeso.

var value = (char)TransactionTypeCode.Shipment; 

// or to make it more explicit: 
var value = Convert.ToChar(TransactionTypeCode.Shipment); 

El segundo causa el boxeo, y por lo tanto debería preformarse peor. Así que puede ser un poco mejor es

var value = Convert.ToChar((int)TransactionTypeCode.Shipment); 

pero feo. Dada la relación rendimiento/legibilidad, prefiero la primera versión (moldeada).

0

los valores subyacentes de la enumeración deben ser numéricos. Si se conoce el tipo de valores subyacentes, un molde simple devuelve el valor subyacente para una instancia determinada de la enumeración.

enum myEnum : byte {Some = 1, SomeMore, Alot, TooMuch}; 
myEnum HowMuch = myEnum.Alot; 
Console.Writeline("How much: {0}", (byte)HowMuch); 

SALIDA: ¿Cuánto: 3

O (más cercano a la pregunta original)

enum myFlags:int {None='N',Alittle='A',Some='S',Somemore='M',Alot='L'}; 
myFlags howMuch = myFlags.Some; 
Console.WriteLine("How much: {0}", (char)howMuch); 
//If you cast as int you get the ASCII value not the character. 

Esta pregunta es recurrente para mí, siempre hay que olvidar que un molde simple que se obtiene el valor .

Cuestiones relacionadas