Методи всередині enum в C #


165

У Java можливі способи всередині enum.

Чи є така можливість у C # чи це просто колекція рядків і все це?

Я намагався перекрити, ToString()але це не компілюється. Хтось має простий код зразка?


Я не думаю, що ви можете мати методи всередині Enum в C #. Що ти намагаєшся зробити?
Дункан Хоу

намагаючись наблизити поведінку Java та інкапсулювати близьку логіку до Enums. все одно я бачу, що з відповідей це неможливо - я буду реалізовувати розширення.
Ея

Відповіді:


272

Ви можете написати методи розширення для типів перерахунків:

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

Інший варіант - використовувати клас перерахунку, створений Джиммі Богаром .

В основному ви повинні створити клас, який успадковується від його Enumeration. Приклад:

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

Тоді ви можете використовувати його як enum, з можливістю помістити методи всередину нього (серед іншого):

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

Ви можете завантажити його з NuGet .

Хоча ця реалізація не є рідною для мови, синтаксис (побудова та використання) є досить близьким до мов, які реалізують перераховується на самому кращому рівні, ніж C # (наприклад, Kotlin ).


3

Ні. Ви можете створити клас, а потім додати до нього клас властивостей, щоб дещо імітувати перерахунок, але це насправді не те саме .

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

Кращою схемою було б розмістити свої методи в класі, окремому від вашого ему.


0

Оскільки я натрапив і мені потрібна точна протилежність перерахунку до рядка, ось загальне рішення:

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

Це також ігнорує випадок і дуже зручно для розбору REST-відповіді на ваш перелік, щоб отримати більше безпеки. Сподіваємось, це комусь допомагає


-15

C # Не дозволяє використовувати методи в обчислювачах, оскільки це не принцип на основі класу, а скоріше двовимірний масив із рядком та значенням.

Використання класів сильно не перешкоджає Microsoft в цьому випадку, використовуйте натомість структуру даних (ures); СТРУКТУР призначений як легкий клас для даних та його обробників і може добре працювати з функціями. C # та його компілятор не мають можливостей відстеження та ефективності, як відомо JAVA, де чим більше разів використовується певний клас / метод, тим швидше він запускається, і його використання стає "очікуваним". У C # просто цього немає, тому для розмежування використовуйте STRUCT замість класу.


7
Сім голосів вниз без жодного коментаря, щоб пояснити, що має бути неправильним у цій відповіді? Давай хлопці ...
Спокійної ночі Nerd Pride

Чи вся інформація, надана в цій публікації, неправильна?
ВК

5
Ця частина відповідає дійсності: C # Не дозволяє використовувати методи в обчислювачах. Я не впевнений, чи міркування вірні, але другий абзац видається абсолютно невідповідним. Якщо є спосіб використовувати структуру для імітації переживань з поведінкою, найкращим є приклад.
Мішель

3
Я думаю, що наслідки тут досить чіткі. Не замінюйте enum (який є типом значення) класом (який є еталонним типом) просто для додавання методів, оскільки структури також можуть мати методи, а також є типовими значеннями.
пах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.