У Java можливі способи всередині enum.
Чи є така можливість у C # чи це просто колекція рядків і все це?
Я намагався перекрити, ToString()
але це не компілюється. Хтось має простий код зразка?
У Java можливі способи всередині enum.
Чи є така можливість у 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.
}
}
Кращою схемою було б розмістити свої методи в класі, окремому від вашого ему.
Оскільки я натрапив і мені потрібна точна протилежність перерахунку до рядка, ось загальне рішення:
static class EnumExtensions {
public static T GetEnum<T>(this string itemName) {
return (T) Enum.Parse(typeof(T), itemName, true);
}
}
Це також ігнорує випадок і дуже зручно для розбору REST-відповіді на ваш перелік, щоб отримати більше безпеки. Сподіваємось, це комусь допомагає
C # Не дозволяє використовувати методи в обчислювачах, оскільки це не принцип на основі класу, а скоріше двовимірний масив із рядком та значенням.
Використання класів сильно не перешкоджає Microsoft в цьому випадку, використовуйте натомість структуру даних (ures); СТРУКТУР призначений як легкий клас для даних та його обробників і може добре працювати з функціями. C # та його компілятор не мають можливостей відстеження та ефективності, як відомо JAVA, де чим більше разів використовується певний клас / метод, тим швидше він запускається, і його використання стає "очікуваним". У C # просто цього немає, тому для розмежування використовуйте STRUCT замість класу.