Методы внутри перечисления в C#
в Java есть возможность написать enum, и функции внутри объекта перечисления, которые могут быть использованы.
есть ли такая возможность в 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.
Неа. Вы можете создать класс, а затем добавить кучу свойств в класс to несколько эмулировать перечисление, но это не совсем то же самое.
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.
Comments