Методы внутри перечисления в C #

165

В Java можно иметь методы внутри перечисления.

Есть ли такая возможность в C # или это просто коллекция строк и все?

Я пытался переопределить, ToString()но он не компилируется. У кого-нибудь есть простой пример кода?

Eya
источник
Я не думаю, что вы можете иметь методы внутри Enum в C #. Что ты пытаешься сделать?
Дункан Хоу
пытаясь получить поведение Java и инкапсулировать близкую логику к Enums. Во всяком случае, я вижу из ответов это не возможно - я буду реализовывать расширения.
Eya

Ответы:

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();
    }
}
MarkPflug
источник
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 ).

fabriciorissetto
источник
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.
    }
}

Лучше было бы поместить ваши методы в класс отдельно от вашего emum.

Кайл Трауберман
источник
0

Поскольку я сталкивался и нуждался в полной противоположности enum to string, вот общее решение:

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

Это также игнорирует регистр и очень удобно для анализа REST-Response для вашего перечисления для обеспечения большей безопасности типов. Надеюсь, это кому-нибудь поможет

scrat84
источник
-15

C # Не позволяет использовать методы в перечислителях, так как это не основанный на классе принцип, а двумерный массив со строкой и значением.

Microsoft не рекомендует использовать классы, в этом случае используйте вместо этого (data) struct (ures); STRUCT задуман как легкий класс для данных и их обработчиков и может отлично справляться с функциями. C # и его компилятор не имеют возможностей отслеживания и эффективности, как известно из JAVA, где чем больше раз используется определенный класс / метод, тем быстрее он запускается и его использование становится «ожидаемым». В C # этого просто нет, поэтому для дифференциации используйте STRUCT вместо CLASS.

user236800
источник
7
Семь голосов без единого комментария, чтобы объяснить, что должно быть не так с этим ответом? Да ладно, ребята ...
Спокойной ночи Nerd Pride
Является ли вся информация, представленная в этом посте, неправильной?
VK
5
Эта часть верна: C # Не разрешает использование методов в перечислителях. Я не уверен, что аргументация правильная, хотя, и второй абзац кажется совершенно не относящимся к вопросу. Если есть способ использовать структуру для симуляции перечисления с поведением, лучше подать пример.
Мишель
3
Я думаю, что последствия довольно ясны здесь. Не заменяйте enum (который является типом значения) классом (который является ссылочным типом) просто для добавления методов, так как структуры также могут иметь методы и также являются типами значений.
пахнет