В Java можно иметь методы внутри перечисления.
Есть ли такая возможность в С# или это просто коллекция строк и все?
Я пытался переопределить ToString()
но он не компилируется. У кого-нибудь есть простой пример кода?
В Java можно иметь методы внутри перечисления.
Есть ли такая возможность в С# или это просто коллекция строк и все?
Я пытался переопределить ToString()
но он не компилируется. У кого-нибудь есть простой пример кода?
Вы можете написать методы расширения для перечисляемых типов:
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();
}
}
Вы можете написать метод расширения для вашего перечисления:
Как создать новый метод для перечисления (Руководство по программированию на С#)
Другой вариант - использовать класс перечисления, созданный Джимми Богардом.
По сути, вы должны создать класс, наследующий его 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.
Хотя эта реализация не является родной для языка, синтаксис (конструкция и использование) довольно близок к языкам, которые реализуют перечисления изначально лучше, чем С# (например, Kotlin).
Неа. Вы можете создать класс, а затем добавить кучу свойств в класс, чтобы несколько эмулировать перечисление, но это на самом деле не то же самое.
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.
Поскольку я сталкивался и нуждался в полной противоположности enum to string, вот общее решение:
static class EnumExtensions {
public static T GetEnum<T>(this string itemName) {
return (T) Enum.Parse(typeof(T), itemName, true);
}
}
Это также игнорирует регистр и очень удобно для анализа REST-Response для вашего перечисления для получения большей безопасности типов. Надеюсь, это кому-нибудь поможет
С# Не разрешает использование методов в счетчиках, поскольку это не основанный на классе принцип, а скорее двумерный массив со строкой и значением.
Использование классов в этом случае настоятельно не рекомендуется Microsoft, вместо этого использовать (data) struct(); STRUCT предназначен как легкий класс для данных и его обработчиков и может прекрасно выполнять функции. С# и его компилятор не имеют возможностей отслеживания и эффективности, как известно из JAVA, где больше времени используется определенный класс/метод, тем быстрее он запускается и его использование становится "ожидаемым". С# просто не имеет этого, поэтому для дифференциации используйте STRUCT вместо CLASS.