Metode di dalam enum dalam C #

165

Di Jawa, dimungkinkan untuk memiliki metode di dalam enum.

Apakah ada kemungkinan seperti itu di C # atau hanya koleksi string dan hanya itu?

Saya mencoba menimpa ToString()tetapi tidak dapat dikompilasi. Apakah seseorang memiliki sampel kode sederhana?

Eya
sumber
Saya tidak berpikir Anda dapat memiliki metode di dalam Enum di C #. Apa yang sedang Anda coba lakukan?
Duncan Howe
mencoba untuk mendapatkan perilaku Java dan merangkum logika dekat ke Enums. Lagi pula saya melihat dari jawaban itu tidak mungkin - saya akan menerapkan ekstensi.
Eya

Jawaban:

272

Anda dapat menulis metode ekstensi untuk tipe 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();
    }
}
MarkPflug
sumber
11

Pilihan lain adalah menggunakan Kelas Enumerasi yang dibuat oleh Jimmy Bogard .

Pada dasarnya, Anda harus membuat kelas yang mewarisi darinya Enumeration. Contoh:

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

Kemudian Anda dapat menggunakannya seperti enum, dengan kemungkinan untuk memasukkan metode di dalamnya (antara lain):

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

Anda dapat mengunduhnya dengan NuGet .

Walaupun implementasi ini bukan asli dalam bahasa, sintaks (konstruksi dan penggunaan) cukup dekat dengan bahasa yang mengimplementasikan enum secara asli lebih baik daripada C # ( misalnya Kotlin ).

fabriciorissetto
sumber
3

Nggak. Anda dapat membuat kelas, lalu menambahkan banyak properti ke kelas untuk agak meniru enum, tapi itu tidak benar-benar hal yang sama .

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

Pola yang lebih baik adalah dengan meletakkan metode Anda di kelas yang terpisah dari emum Anda.

Kyle Trauberman
sumber
0

Karena saya menemukan, dan membutuhkan kebalikan dari enum to string, berikut adalah solusi Generik:

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

Ini juga mengabaikan case dan sangat berguna untuk mem-parsing REST-Response ke enum Anda untuk mendapatkan lebih banyak keamanan jenis. Semoga ini membantu seseorang

scrat84
sumber
-15

C # Tidak mengizinkan penggunaan metode dalam enumerator karena ini bukan prinsip berbasis kelas, melainkan array 2 dimensi dengan string dan nilai.

Penggunaan kelas sangat tidak disarankan oleh Microsoft dalam hal ini, gunakan (data) struct (ures) sebagai gantinya; STRUCT dimaksudkan sebagai kelas ringan untuk data dan penangannya dan dapat menangani fungsi dengan baik. C # dan kompilernya tidak memiliki kemampuan pelacakan dan efisiensi seperti yang diketahui dari JAVA, di mana semakin sering suatu kelas / metode tertentu digunakan semakin cepat ia berjalan dan penggunaannya menjadi 'diantisipasi'. C # tidak punya itu, jadi untuk membedakan, gunakan STRUCT bukan CLASS.

pengguna236800
sumber
7
Tujuh suara tanpa satu komentar untuk menjelaskan apa yang seharusnya salah dengan jawaban ini? Ayo teman-teman ...
Selamat Malam Nerd Pride
Apakah semua informasi yang diberikan dalam posting ini salah?
VK
5
Bagian ini benar: C # Tidak mengizinkan penggunaan metode dalam enumerator. Saya tidak yakin apakah alasannya benar, dan paragraf kedua tampaknya sama sekali tidak relevan dengan pertanyaan. Jika ada cara untuk menggunakan struct untuk mensimulasikan enum dengan perilaku, memberikan contoh akan lebih baik.
Mishelle
3
Saya pikir implikasinya cukup jelas di sini. Jangan ganti enum (yang merupakan tipe nilai) dengan kelas (yang merupakan tipe referensi) hanya untuk menambahkan metode, karena struct juga dapat memiliki metode dan juga tipe nilai.
smelch