2008-09-18 21 views
14

Ich habe folgende Enum erklärt:Wie den zugrunde liegenden Wert eines Aufzählungs bekommt

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

Wie bekomme ich den Wert ‚S‘ von einer TransactionTypeCode.Shipment oder ‚R‘ aus TransactionTypeCode.Receipt?

Einfach tun TransactionTypeCode.ToString() gibt eine Zeichenfolge der Aufzählung Name "Sendung" oder "Empfang", so dass es nicht Senf.

Antwort

3

Try this:

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

Eigentlich ist es ein wenig komplexer, ich kopierte den Code falsch aus meiner Probe, Sie können keine Zeichenfolgen für Werte in einer Aufzählung haben.Die vollständige Antwort wäre also ((char) instance.Shipment), ToString() –

+3

@GeorgeMauer Der "zugrunde liegende Typ" Ihrer enum ist immer noch "int", so dass Ihre Definition wirklich sagt: 'enum TransactionTypeCode {Shipment = 83, Receipt = 82,} '. Es gibt eine implizite Umwandlung von 'char' nach' int', aus irgendeinem Grund. Das einzige "Problem" (das kein Problem sein könnte) mit Ihrer Enum ist, dass 'default (TransactionTypeCode)' keinen Namen hat, da kein Member gleich 0 (oder ''\ 0'') ist. –

+3

Diese Antwort ist auf jeder Ebene kategorisch falsch. Beginnen Sie mit der Tatsache, dass es nicht kompiliert wird, und fahren Sie mit der Tatsache fort, dass Aufzählungen keine Zeichenfolgen sind, dass Zeichen keine Zeichenfolgen sind und dass der zugrunde liegende Typ der Aufzählung nicht - und nicht - eine Zeichenfolge sein kann . –

2

Ich glaube Enum.GetValues ​​() ist, was Sie suchen.

0

Dies ist, wie ich meine Aufzählungen im Allgemeinen ein:

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

Diese Frage ist für C#. – Iain

0

ich für diese Suche wurde und ich bekomme die Lösung Verwenden Sie die Convert Klasse

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

sehen Sie, wie es einfach ist

+1

Nicht zu vergessen, das ruft die 'Convert.ToInt32 (object)' Überladung auf, die Boxen verursacht und daher langsamer ist. Nichts zu beunruhigen, sagte nur. Einfacher für meine Augen ist '(int) enumValue' immer. – nawfal

29

Sie haben den zugrunde liegenden Typ der Aufzählung zu prüfen und dann zu einem richtigen Typ umwandeln:

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

Ich nehme an, wenn Sie den zugrunde liegenden Typ der Enum nicht kennen, wäre dies der Weg, es zu tun. Aber wie du jemals in dieser Situation enden würdest, ist mir ein Rätsel. –

+2

+1 Dies ist der letzte Schritt, den ich automatisch (durch Reflektion) benötigte, um meine SP-Parameterwertliste von einem Entitätsobjekt zu erstellen. Ich kann die Enumeration nicht in der Datenbank speichern, deshalb speichere ich den zugrunde liegenden Wert. – jimr

+1

Der Convert.ChangeType benötigt einen FormatProvider, aber für Enums (was im Grunde Ints sind) denke ich, dass Sie einfach null übergeben können. +1 für den Tipp. @GeorgeMauer: Ich bin in SterlingDB mit einer solchen Situation gelandet, wo alle Arten von Typen in eine Datei serialisiert werden. Ein Objekt wird also an die serialize-Methode übergeben. Wenn es sich um eine Enumeration handelt, werden wir den Integer-Wert serialisieren, sodass wir den zugrunde liegenden Wert benötigen. – Peter

1

Der zugrunde liegende Typ Ihres Enum int ist nach wie vor, nur, dass es von char zu int aus irgendeinem Grund eine implizite Konvertierung ist . Ihre Enum entspricht

TransactionTypeCode { Shipment = 83, Receipt = 82, } 

Beachten Sie auch, dass enum can have any integral type as underlying type except char, wahrscheinlich aus irgendeinem semantischen Grund. Dies ist nicht möglich:

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

zurück char Wert zu erhalten, können Sie einfach eine Besetzung verwenden.

var value = (char)TransactionTypeCode.Shipment; 

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

Die zweite verursacht Boxen, und sollte daher schlimmer vor. So kann etwas besser sein ist

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

aber hässlich. Bei gegebenem Leistungs/Lesbarkeits-Kompromiss bevorzuge ich die erste (Cast-) Version.

0

Die zugrunde liegenden Werte der Enumeration müssen numerisch sein. Wenn der Typ der zugrunde liegenden Werte bekannt ist, gibt eine einfache Umwandlung den zugrunde liegenden Wert für eine bestimmte Instanz der Aufzählung zurück.

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

OUTPUT: Wieviel: 3

OR (näher an die ursprünglichen Frage)

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. 

Dies wird immer wieder die Frage für mich, ich vergesse immer, dass ein einfacher Guss bekommt man den Wert .

Verwandte Themen