W Javie możliwe jest umieszczenie metod wewnątrz wyliczenia.
Czy w C # jest taka możliwość, czy jest to tylko zbiór ciągów i to wszystko?
Próbowałem zastąpić, ToString()
ale to się nie kompiluje. Czy ktoś ma prosty przykład kodu?
W Javie możliwe jest umieszczenie metod wewnątrz wyliczenia.
Czy w C # jest taka możliwość, czy jest to tylko zbiór ciągów i to wszystko?
Próbowałem zastąpić, ToString()
ale to się nie kompiluje. Czy ktoś ma prosty przykład kodu?
Odpowiedzi:
Możesz pisać metody rozszerzające dla typów wyliczeniowych:
enum Stuff
{
Thing1,
Thing2
}
static class StuffMethods
{
public static String GetString(this Stuff s1)
{
switch (s1)
{
case Stuff.Thing1:
return "Yeah!";
case Stuff.Thing2:
return "Okay!";
default:
return "What?!";
}
}
}
class Program
{
static void Main(string[] args)
{
Stuff thing = Stuff.Thing1;
String str = thing.GetString();
}
}
Możesz napisać metodę rozszerzenia dla swojego wyliczenia:
Instrukcje: tworzenie nowej metody wyliczenia (przewodnik programowania w języku C #)
Inną opcją jest użycie klasy wyliczenia stworzonej przez Jimmy'ego Bogarda .
Zasadniczo musisz stworzyć klasę, która dziedziczy po jego Enumeration
. Przykład:
public class EmployeeType : Enumeration
{
public static readonly EmployeeType Manager
= new EmployeeType(0, "Manager");
public static readonly EmployeeType Servant
= new EmployeeType(1, "Servant");
public static readonly EmployeeType Assistant
= new EmployeeType(2, "Assistant to the Regional Manager");
private EmployeeType() { }
private EmployeeType(int value, string displayName) : base(value, displayName) { }
// Your method...
public override string ToString()
{
return $"{value} - {displayName}!";
}
}
Następnie możesz użyć go jak wyliczenia, z możliwością umieszczenia w nim metod (między innymi):
EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager
Możesz go pobrać za pomocą NuGet .
Chociaż ta implementacja nie jest natywna w języku, składnia (konstrukcja i użycie) jest bardzo zbliżona do języków, które implementują wyliczenia natywnie lepiej niż C # ( na przykład Kotlin ).
Nie. Możesz utworzyć klasę, a następnie dodać kilka właściwości do klasy, aby w pewnym stopniu emulować wyliczenie, ale to nie to samo .
class MyClass
{
public string MyString1 { get{ return "one";} }
public string MyString2 { get{ return "two";} }
public string MyString3 { get{ return "three";} }
public void MyMethod()
{
// do something.
}
}
Lepszym wzorcem byłoby umieszczenie metod w klasie innej niż emum.
Ponieważ natknąłem się i potrzebowałem dokładnego przeciwieństwa wyliczenia do ciągu, oto rozwiązanie ogólne:
static class EnumExtensions {
public static T GetEnum<T>(this string itemName) {
return (T) Enum.Parse(typeof(T), itemName, true);
}
}
To również ignoruje wielkość liter i jest bardzo przydatne do analizowania odpowiedzi REST w wyliczeniu, aby uzyskać większe bezpieczeństwo typów. Mam nadzieję, że to komuś pomoże
C # nie zezwala na używanie metod w modułach wyliczających, ponieważ nie jest to zasada oparta na klasach, ale raczej dwuwymiarowa tablica z ciągiem i wartością.
Microsoft zdecydowanie odradza używanie klas w tym przypadku, zamiast tego użyj (data) struct (ures); STRUCT jest lekką klasą dla danych i ich procedur obsługi i może dobrze obsługiwać funkcje. C # i jego kompilator nie mają możliwości śledzenia i wydajności, jakie znamy z JAVA, gdzie im więcej razy dana klasa / metoda jest używana, tym szybciej działa i jej użycie staje się „oczekiwane”. C # po prostu tego nie ma, więc aby odróżnić, użyj STRUCT zamiast CLASS.