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.