Moje wyliczenie składa się z następujących wartości:
private enum PublishStatusses{
NotCompleted,
Completed,
Error
};
Chcę jednak móc wyświetlać te wartości w sposób przyjazny dla użytkownika.
Nie muszę być w stanie ponownie przechodzić od łańcucha do wartości.
Odpowiedzi:
Korzystam z
Description
atrybutu z przestrzeni nazw System.ComponentModel. Po prostu udekoruj enum:Następnie użyj tego kodu, aby go odzyskać:
źródło
ArgumentException
, to nie ma powodu, aby metoda była całkowicie ogólna.Robię to za pomocą metod rozszerzenia:
źródło
default
implementacjame.ToString()
instrukcji zwróciła i podawała tylko instrukcje case switch dla wartości wyliczenia, które chcesz zastąpić. W twoim przykładzie rozumiem, że wszystkie są różne, ale w rzeczywistych przypadkach użycia, podejrzewam, że większość wartości pojedynczego słowa wyliczeniowego będzie wystarczająca, a ty będziesz nadpisywać tylko wartości wielowymiarowe wyliczeniowe.Może czegoś mi brakuje, ale co jest nie tak z Enum.GetName?
edycja: dla ciągów przyjaznych dla użytkownika, musisz przejść przez .resource, aby zrobić internacjonalizację / lokalizację, i prawdopodobnie lepiej byłoby użyć stałego klucza opartego na kluczu wyliczającym niż atrybutu dekoratora na tym samym.
źródło
Utworzyłem metodę rozszerzenia wstecznego, aby przekonwertować opis z powrotem na wartość wyliczoną:
źródło
Najłatwiejszym rozwiązaniem jest użycie niestandardowej metody rozszerzenia (przynajmniej w .NET 3.5 - możesz po prostu przekonwertować ją na statyczną metodę pomocniczą dla wcześniejszych wersji frameworka).
Zakładam tutaj, że chcesz zwrócić coś innego niż faktyczna nazwa wartości wyliczeniowej (którą możesz uzyskać po prostu wywołując ToString).
źródło
Ten drugi post to Java. Nie można umieszczać metod w Enums w C #.
po prostu zrób coś takiego:
Jeśli chcesz użyć różnych wartości wyświetlanych dla swoich wartości wyliczeniowych, możesz użyć atrybutów i refleksji.
źródło
Najprostszym sposobem jest włączenie tej klasy rozszerzenia do projektu, będzie ona działać z dowolnym wyliczeniem w projekcie:
Stosowanie:
...
źródło
string result = "Result: " + ee;
Niektóre inne bardziej prymitywne opcje, które unikają klas / typów referencji:
Metoda tablicowa
Stosowanie
Zagnieżdżona metoda struct
Stosowanie
Aktualizacja (03/09/2018)
Hybrydowa metoda przedłużania i pierwsza technika powyżej.
Wolę, aby wyliczenia były definiowane tam, gdzie „należą” (najbliżej źródła pochodzenia, a nie w jakiejś wspólnej, globalnej przestrzeni nazw).
Wydaje się, że metoda rozszerzenia pasuje do wspólnego obszaru, a „zlokalizowana” definicja wyliczenia sprawia, że metoda rozszerzenia jest bardziej szczegółowa.
Przykład użycia wyliczenia i jego metody rozszerzenia.
Uwaga: Właściwie postanowiłem wyeliminować
Enum
opakowanie (iName
tablicę), ponieważ najlepiej jest, aby ciągi nazw pochodziły z zasobu (tj. Pliku konfiguracyjnego lub DB), a nie były na stałe zakodowane, a ponieważ w końcu umieściłem metodę rozszerzenia wViewModels
przestrzeń nazw (tylko w innym pliku „CommonVM.cs”). Ponadto cała.Id
sprawa staje się rozpraszająca i nieporęczna.CommonVM.cs
Przykład użycia wyliczenia i jego metody rozszerzenia.
źródło
Można użyć Humanizer pakiet z uczłowieczyć wyliczenia zabudowy mogły. Przykład:
możesz użyć
Humanize
metody rozszerzenia bezpośrednio na enum:źródło
W przypadku Raya Booysena w kodzie jest błąd: Enum ToString z przyjaznymi dla użytkownika ciągami znaków
Musisz uwzględnić wiele atrybutów wartości wyliczeniowych.
źródło
źródło
this
parametr metod rozszerzeń, który można zobaczyćThis
w wielu przykładach w Internecie. Wywołanie go w taki sam sposób, jak zrobiłeś (Enum Enum
), czyni kod mniej czytelnym.Zamiast używać wyliczenia użyj klasy statycznej.
zastąpić
z
będzie używany w ten sposób
Problem z wykorzystaniem najlepszych rozwiązań „metody rozszerzenia”:
Prywatne wyliczenie jest często używane w innej klasie. Rozwiązanie metody rozszerzenia nie jest tam poprawne, ponieważ musi należeć do własnej klasy. To rozwiązanie może być prywatne i osadzone w innej klasie.
źródło
Zdarza się, że jestem fanem VB.NET, więc oto moja wersja, łącząc metodę DescriptionAttribute z metodą rozszerzenia. Po pierwsze, wyniki:
Podstawowe rzeczy: wyliczenie o nazwie EnumType z trzema wartościami V1, V2 i V3. „Magia” występuje w wywołaniu Console.WriteLine w Sub Main (), gdzie ostatni argument jest po prostu
v.Description
. Zwraca „One” dla V1, „V2” dla V2 i „Three” dla V3. Ta metoda opisu jest w rzeczywistości metodą rozszerzenia, zdefiniowaną w innym module o nazwie EnumExtensions:Ponieważ wyszukiwanie atrybutów opisu przy użyciu
Reflection
jest powolne, wyszukiwania są również buforowane w pamięci prywatnejDictionary
, która jest wypełniana na żądanie.(Przepraszamy za rozwiązanie VB.NET - przetłumaczenie go na język C # powinno być względnie łatwe, a mój język C # zardzewiałe na nowe tematy, takie jak rozszerzenia)
źródło
Czyste podsumowanie powyższych sugestii z próbką:
STOSOWANIE:
źródło
Użyj Enum.GetName
Z powyższego linku ...
źródło
Zgodnie z tą dokumentacją: https://docs.microsoft.com/pt-br/dotnet/api/system.enum.tostring?view=netframework-4.8
Można po prostu przekonwertować moduł wyliczający na ciąg znaków, używając formatu takiego jak ten:
Wszystkie możliwe formaty można zobaczyć w tym linku: https://docs.microsoft.com/pt-br/dotnet/api/system.string?view=netframework-4.8
źródło
Jest to aktualizacja kodu Raya Booysena, który używa ogólnej metody GetCustomAttributes i LINQ, aby uczynić wszystko nieco bardziej uporządkowanym.
źródło
Jeszcze czystsze podsumowanie:
Takie samo użycie jak w przypadku podkreślenia.
źródło
Do wyliczania flag, w tym.
źródło
Jeśli chcesz dodać spację między słowami, jest to tak proste, jak
źródło
Używam klasy ogólnej do przechowywania par wyliczenia / opisu i zagnieżdżonej klasy pomocnika, aby uzyskać opis.
Enum :
Klasa ogólna:
Uwaga: Ponieważ klasa ogólna nie może być ograniczona przez wyliczanie , ograniczam je przez struct i sprawdzam, czy w konstruktorze występuje wyliczanie .
Stosowanie:
źródło
Myślę, że najlepszym (i najłatwiejszym) sposobem rozwiązania problemu jest napisanie metody rozszerzenia dla Twojego wyliczenia:
źródło
Jeśli chcesz coś całkowicie konfigurowalnego, wypróbuj moje rozwiązanie tutaj:
http://www.kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx
Zasadniczo post opisuje, jak dołączyć atrybuty opisu do każdego z twoich wyliczeń i zapewnia ogólny sposób mapowania od wyliczenia do opisu.
źródło