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

в Java есть опция для записи перечисления и функций внутри объекта перечисления, которые могут быть использованы.

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

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

5 ответов


можно писать методы расширения для перечисления:

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

вы можете написать метод расширения для перечисления:

как: создать новый метод перечисления (руководство по программированию на C#)


другой вариант-использовать Перечисление Класс создано Джимми Богард.

в принципе, вы должны создать класс, который наследует от него 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}!";
    }
}

тогда вы можете использовать его как перечисление, с возможностью поместить в него методы (среди прочего):

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

вы можете скачать его с NuGet для.


Неа. Вы можете создать класс, а затем добавить кучу свойств в класс в несколько эмулировать перечисление, но это не совсем то же самое.

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.


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

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