Методы внутри перечисления в 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.