Methoden innerhalb der Aufzählung in C #

165

In Java ist es möglich, Methoden in einer Aufzählung zu haben.

Gibt es eine solche Möglichkeit in C # oder ist es nur eine String-Sammlung und das wars?

Ich habe versucht zu überschreiben, ToString()aber es wird nicht kompiliert. Hat jemand ein einfaches Codebeispiel?

Eya
quelle
Ich glaube nicht, dass Sie Methoden in einer Aufzählung in C # haben können. Was versuchst du zu machen?
Duncan Howe
versuchen, Java-Verhalten zu erhalten und eine enge Logik für Enums zu kapseln. Trotzdem sehe ich aus den Antworten, dass es nicht möglich ist - ich werde Erweiterungen implementieren.
Eya

Antworten:

272

Sie können Erweiterungsmethoden für Aufzählungstypen schreiben :

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();
    }
}
MarkPflug
quelle
11

Eine weitere Option ist die Verwendung der von Jimmy Bogard erstellten Aufzählungsklasse .

Grundsätzlich müssen Sie eine Klasse erstellen, die von seiner erbt Enumeration. Beispiel:

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}!";
    }
}

Dann können Sie es wie eine Aufzählung verwenden, mit der Möglichkeit, Methoden darin zu platzieren (unter anderem):

EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager

Sie können es mit NuGet herunterladen .

Obwohl diese Implementierung nicht in der Sprache muttersprachlich ist, kommt die Syntax (Konstruktion und Verwendung) Sprachen sehr nahe, die Enums nativ besser implementieren als C # ( z. B. Kotlin ).

Fabriciorissetto
quelle
3

Nee. Sie können eine Klasse erstellen und dann der Klasse eine Reihe von Eigenschaften hinzufügen, um eine Aufzählung etwas zu emulieren, aber das ist nicht wirklich dasselbe .

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.
    }
}

Ein besseres Muster wäre, Ihre Methoden in eine von Ihrem Emum getrennte Klasse einzuteilen.

Kyle Trauberman
quelle
0

Da ich auf das genaue Gegenteil von enum to string gestoßen bin, ist hier eine generische Lösung:

static class EnumExtensions {
    public static T GetEnum<T>(this string itemName) {
        return (T) Enum.Parse(typeof(T), itemName, true);
    }
}

Dies ignoriert auch Groß- und Kleinschreibung und ist sehr praktisch, um REST-Response auf Ihre Enumeration zu analysieren, um mehr Typensicherheit zu erhalten. Hoffentlich hilft es jemandem

scrat84
quelle
-15

C # erlaubt keine Verwendung von Methoden in Enumeratoren, da es sich nicht um ein klassenbasiertes Prinzip handelt, sondern um ein zweidimensionales Array mit einer Zeichenfolge und einem Wert.

Die Verwendung von Klassen wird von Microsoft in diesem Fall dringend empfohlen. Verwenden Sie stattdessen (Daten-) Strukturen (ures). Der STRUCT ist als Light-Klasse für Daten und ihre Handler gedacht und kann Funktionen problemlos ausführen. C # und sein Compiler verfügen nicht über die Tracking- und Effizienzfunktionen, wie man sie von JAVA kennt. Je öfter eine bestimmte Klasse / Methode verwendet wird, desto schneller wird sie ausgeführt und ihre Verwendung wird "vorweggenommen". C # hat das einfach nicht. Verwenden Sie zur Unterscheidung STRUCT anstelle von CLASS.

user236800
quelle
7
Sieben Abstimmungen ohne einen einzigen Kommentar, um zu erklären, was mit dieser Antwort falsch sein soll? Komm schon Leute ...
Gute Nacht Nerd Pride
Sind alle Informationen in diesem Beitrag falsch?
VK
5
Dieser Teil ist wahr: C # Erlaubt nicht die Verwendung von Methoden in Enumeratoren. Ich bin mir jedoch nicht sicher, ob die Argumentation richtig ist, und der zweite Absatz scheint für die Frage völlig irrelevant zu sein. Wenn es eine Möglichkeit gibt, eine Struktur zu verwenden, um eine Aufzählung mit Verhalten zu simulieren, ist es am besten, ein Beispiel anzugeben.
Mishelle
3
Ich denke, die Implikationen sind hier ziemlich klar. Ersetzen Sie eine Aufzählung (die ein Werttyp ist) nicht durch eine Klasse (die ein Referenztyp ist), nur um Methoden hinzuzufügen, da Strukturen auch Methoden haben können und auch Werttypen sind.
riechen