Mam wyliczenie:
public enum MyColours
{
Red,
Green,
Blue,
Yellow,
Fuchsia,
Aqua,
Orange
}
i mam ciąg:
string colour = "Red";
Chcę móc wrócić:
MyColours.Red
z:
public MyColours GetColour(string colour)
Jak dotąd mam:
public MyColours GetColours(string colour)
{
string[] colours = Enum.GetNames(typeof(MyColours));
int[] values = Enum.GetValues(typeof(MyColours));
int i;
for(int i = 0; i < colours.Length; i++)
{
if(colour.Equals(colours[i], StringComparison.Ordinal)
break;
}
int value = values[i];
// I know all the information about the matched enumeration
// but how do i convert this information into returning a
// MyColour enumeration?
}
Jak widać, trochę utknąłem. Czy mimo to można wybrać moduł wyliczający według wartości. Coś jak:
MyColour(2)
spowoduje
MyColour.Green
c#
string
enumeration
Matt Clarkson
źródło
źródło
Odpowiedzi:
sprawdź System.Enum.Parse:
źródło
Możesz rzutować int na wyliczenie
Istnieje również opcja Enum.Parse
źródło
Biorąc pod uwagę najnowsze i największe zmiany w .NET (+ Core) i C # 7, oto najlepsze rozwiązanie:
zmienną koloru można używać w zakresie Enum.TryParse
źródło
Wszystko czego potrzebujesz to Enum.Parse .
źródło
Oznaczyłem odpowiedź OregonGhost +1, a następnie spróbowałem użyć iteracji i zdałem sobie sprawę, że to nie jest w porządku, ponieważ Enum.GetNames zwraca ciągi. Chcesz Enum.GetValues:
źródło
Możesz użyć,
Enum.Parse
aby uzyskać wartość wyliczenia z nazwy. Możesz iterować po wszystkich wartościach za pomocąEnum.GetNames
i możesz po prostu rzutować int na wyliczenie, aby uzyskać wartość wyliczenia z wartości int.Na przykład tak:
lub:
Ten ostatni wyrzuci ArgumentException, jeśli wartość nie zostanie znaleziona, możesz chcieć przechwycić ją wewnątrz funkcji i zwrócić wartość domyślną.
źródło
źródło
Parse
metody ogólnej .Jak wspomniano w poprzednich odpowiedziach, można rzutować bezpośrednio na podstawowy typ danych (int -> typ wyliczenia) lub analizować (ciąg -> typ wyliczenia).
ale uważaj - nie ma .TryParse dla wyliczeń, więc będziesz potrzebować bloku try / catch wokół parsowania, aby złapać błędy.
źródło
źródło
Jedną rzeczą, która może ci się przydać (poza już poprawnymi / dobrymi odpowiedziami udzielonymi do tej pory) jest idea StringEnum podana tutaj
Dzięki temu możesz zdefiniować swoje wyliczenia jako klasy (przykłady znajdują się w vb.net):
A teraz możesz użyć tej klasy tak, jak używałbyś wyliczenia: eAuthenticationMethod.WindowsAuthentication i byłoby to zasadniczo podobne do przypisania `` W '' wartości logicznej WindowsAuthentication (wewnątrz wyliczenia) i gdybyś miał wyświetlić tę wartość z właściwości window (lub coś innego, które używa właściwości System.ComponentModel.Description), otrzymasz „ Użyj uwierzytelniania systemu Windows ”.
Używam tego od dłuższego czasu i dzięki temu kod jest bardziej przejrzysty.
źródło
źródło
Możesz również zapoznać się z sugestiami zawartymi w tym poście na blogu: Mój nowy mały przyjaciel, Enum <T>
W poście opisano sposób tworzenia bardzo prostej ogólnej klasy pomocniczej, która pozwala uniknąć brzydkiej składni rzutowania nieodłącznie związanej z
Enum.Parse
- zamiast tego w kodzie piszesz coś takiego:Lub sprawdź niektóre komentarze w tym samym poście, które mówią o użyciu metody rozszerzenia w celu osiągnięcia podobnych wyników.
źródło