Metodi all'interno di enum in C #


165

In Java, è possibile avere metodi all'interno di un enum.

C'è una tale possibilità in C # o è solo una raccolta di stringhe e basta?

Ho provato a eseguire l'override ToString()ma non viene compilato. Qualcuno ha un semplice esempio di codice?


Non penso che tu possa avere metodi all'interno di un Enum in C #. Cosa stai cercando di fare?
— Duncan Howe,

cercando di ottenere il comportamento Java e incapsulare una logica stretta su Enums. comunque vedo dalle risposte che non è possibile - implementerò le estensioni.
— Eya,

Risposte:


272

È possibile scrivere metodi di estensione per tipi di enum:

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


11

Un'altra opzione è quella di utilizzare la classe di enumerazione creata da Jimmy Bogard .

Fondamentalmente, devi creare una classe che eredita dalla sua Enumeration. Esempio:

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

Quindi puoi usarlo come un enum, con la possibilità di inserire metodi al suo interno (tra le altre cose):

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

Puoi scaricarlo con NuGet .

Sebbene questa implementazione non sia nativa nella lingua, la sintassi (costruzione e utilizzo) è abbastanza vicina ai linguaggi che implementano gli enum in modo nativo migliore di C # ( Kotlin per esempio).


3

No. Puoi creare una classe, quindi aggiungere un sacco di proprietà alla classe per emulare un po ' un enum, ma non è proprio la stessa cosa .

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

Un modello migliore sarebbe quello di mettere i tuoi metodi in una classe separata dalla tua emum.


0

Da quando mi sono imbattuto, e avevo bisogno dell'esatto contrario di enum alla stringa, ecco una soluzione generica:

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

Ciò ignora anche il caso ed è molto utile per analizzare la risposta REST al tuo enum per ottenere una maggiore sicurezza del tipo. Spero che aiuti qualcuno


-15

C # Non consente l'uso di metodi negli enumeratori in quanto non è un principio di classe, ma piuttosto un array bidimensionale con una stringa e un valore.

L'uso delle classi è fortemente scoraggiato da Microsoft in questo caso, utilizzare invece (data) struct (ures); STRUCT è concepito come una classe leggera per i dati e i suoi gestori e può gestire bene le funzioni. C # e il suo compilatore non hanno le capacità di tracciamento ed efficienza come si sa da JAVA, dove più volte viene utilizzata una determinata classe / metodo più veloce viene eseguito e il suo utilizzo diventa "anticipato". C # semplicemente non ce l'ha, quindi per differenziare, usa STRUCT invece di CLASS.


7
Sette voti negativi senza un singolo commento per spiegare cosa dovrebbe essere sbagliato in questa risposta? Forza ragazzi ...
— Good Night Nerd Pride,

Tutte le informazioni fornite in questo post sono errate?
— VK,

5
Questa parte è vera: C # Non consente l'uso di metodi negli enumeratori. Non sono sicuro però se il ragionamento sia corretto e il secondo paragrafo sembra del tutto irrilevante per la domanda. Se c'è un modo di usare una struttura per simulare un enum con il comportamento, fornire un esempio sarebbe il migliore.
— Mishelle,

3
Penso che le implicazioni siano abbastanza chiare qui. Non sostituire un enum (che è un tipo di valore) con una classe (che è un tipo di riferimento) solo per aggiungere metodi, poiché anche le strutture possono avere metodi e sono anche tipi di valore.
— smelch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.