2013-05-09 8 views
5

Niedawno wystąpił przypadek kiedy potrzebne, aby uzyskać Enum obiekt przez wartość (być zapisywane poprzez EF CodeFirst), a tu jest mój Enum:Jak uzyskać obiekt Enum według wartości w języku C#?

public enum ShipmentStatus { 
    New = 0, 
    Shipped = 1, 
    Canceled = 2 
} 

Więc musiałem dostać ShipmentStatus.Shipped obiektu według wartości .

Jak mogę to zrobić?

+0

To jest dobre Q, chociaż zostało omówione wcześniej w wielu wątkach. –

Odpowiedz

6

Dlaczego nie korzystać z tej kompilacji w funkcji?

ShipmentStatus shipped = (ShipmentStatus)System.Enum.GetValues(typeof(ShipmentStatus)).GetValue(1); 
+0

To jest również dobre! (+) –

1

Po pewnym Walka z Enum Stworzyłem ten - uniwersalny klasy pomocnika, który zrobi to, co potrzebne - Pobieranie klucza przez wartość, a co ważniejsze - od ANY Enum typ:

public static class EnumHelpers { 

    public static T GetEnumObjectByValue<T>(int valueId) { 
    return (T) Enum.ToObject(typeof (T), valueId); 
    } 

} 

Tak , aby uzyskać Enum obiekt ShipmentStatus.Shipped ten powróci obiektu:

var enumObject = EnumHelpers.GetEnumObjectByValue<ShipmentStatus>(1); 

Więc basicaly można użyć dowolnego Enum obiekt i uzyskać jego klucz o wartości:

var enumObject = EnumHelpers.GetEnumObjectByValue<YOUR_ENUM_TYPE>(VALUE); 
+4

Możesz chcieć dodać czek, aby upewnić się, że wartość jest ważna dla 'Enum'. Zgodnie z dokumentacją dla 'Enum.ToObject' nie sprawdza tego. Możesz użyć do tego 'Enum.IsDefined'. – juharr

+0

Dokładnie tak! W przeciwnym razie konwersja jest po prostu linią kodu. –

6

To powinno działać, albo (tylko odlewania wartość int do enum typu):

int _val = 1; 
ShipmentStatus _item = (ShipmentStatus)_val; 

Strzeż się, że może to spowodować błąd, jeżeli enum nie jest zdefiniowana.

+1

hmm nie pomyślał o tym. dużo krócej :) – middelpat

+0

Tak, to trochę "skrót" :-) –

Powiązane problemy