В Java можно иметь методы внутри перечисления.
Есть ли такая возможность в C # или это просто коллекция строк и все?
Я пытался переопределить, ToString()
но он не компилируется. У кого-нибудь есть простой пример кода?
В Java можно иметь методы внутри перечисления.
Есть ли такая возможность в C # или это просто коллекция строк и все?
Я пытался переопределить, 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();
}
}
Вы можете написать метод расширения для вашего перечисления:
Как: создать новый метод для перечисления (Руководство по программированию в 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}!";
}
}
Затем вы можете использовать его как enum с возможностью помещать в него методы (среди прочего):
EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager
Вы можете скачать его с NuGet .
Хотя эта реализация не является родной для языка, синтаксис (конструирование и использование) довольно близок к языкам, которые реализуют перечисления изначально лучше, чем C # ( например, 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 для вашего перечисления для обеспечения большей безопасности типов. Надеюсь, это кому-нибудь поможет
C # Не позволяет использовать методы в перечислителях, так как это не основанный на классе принцип, а двумерный массив со строкой и значением.
Microsoft не рекомендует использовать классы, в этом случае используйте вместо этого (data) struct (ures); STRUCT задуман как легкий класс для данных и их обработчиков и может отлично справляться с функциями. C # и его компилятор не имеют возможностей отслеживания и эффективности, как известно из JAVA, где чем больше раз используется определенный класс / метод, тем быстрее он запускается и его использование становится «ожидаемым». В C # этого просто нет, поэтому для дифференциации используйте STRUCT вместо CLASS.