Trong Java, có thể có các phương thức bên trong enum.
Có khả năng như vậy trong C # hay nó chỉ là một bộ sưu tập chuỗi và đó là nó?
Tôi đã cố gắng ghi đè ToString()
nhưng nó không biên dịch. Có ai có một mẫu mã đơn giản?
Trong Java, có thể có các phương thức bên trong enum.
Có khả năng như vậy trong C # hay nó chỉ là một bộ sưu tập chuỗi và đó là nó?
Tôi đã cố gắng ghi đè ToString()
nhưng nó không biên dịch. Có ai có một mẫu mã đơn giản?
Câu trả lời:
Bạn có thể viết các phương thức mở rộng cho các loại enum:
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();
}
}
Bạn có thể viết một phương thức mở rộng cho enum của bạn:
Cách làm: Tạo một phương thức mới để liệt kê (Hướng dẫn lập trình C #)
Một tùy chọn khác là sử dụng Lớp liệt kê được tạo bởi Jimmy Bogard .
Về cơ bản, bạn phải tạo một lớp kế thừa từ anh ấy Enumeration
. Thí dụ:
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}!";
}
}
Sau đó, bạn có thể sử dụng nó như một enum, với khả năng đặt các phương thức bên trong nó (trong số những thứ khác):
EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager
Bạn có thể tải xuống với NuGet .
Mặc dù việc triển khai này không có nguồn gốc trong ngôn ngữ, cú pháp (xây dựng và sử dụng) khá gần với các ngôn ngữ thực hiện enum tốt hơn so với C # ( ví dụ như Kotlin ).
Không. Bạn có thể tạo một lớp, sau đó thêm một loạt các thuộc tính vào lớp để phần nào mô phỏng một enum, nhưng đó không thực sự giống như vậy .
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.
}
}
Một mô hình tốt hơn sẽ là đặt các phương thức của bạn trong một lớp tách biệt với emum của bạn.
Vì tôi đã đi qua và cần sự đối lập chính xác của enum với chuỗi, đây là một giải pháp Chung:
static class EnumExtensions {
public static T GetEnum<T>(this string itemName) {
return (T) Enum.Parse(typeof(T), itemName, true);
}
}
Điều này cũng bỏ qua trường hợp và rất thuận tiện để phân tích cú pháp REST-Feedback cho enum của bạn để có được sự an toàn kiểu hơn. Hy vọng nó sẽ giúp được ai đó
C # Không cho phép sử dụng các phương thức trong liệt kê vì nó không phải là nguyên tắc dựa trên lớp, mà là một mảng 2 chiều với một chuỗi và giá trị.
Việc sử dụng các lớp được Microsoft khuyến khích trong trường hợp này, thay vào đó, hãy sử dụng (dữ liệu) struct (ures); CẤU TRÚC được dự định là một lớp ánh sáng cho dữ liệu và trình xử lý của nó và có thể xử lý các chức năng tốt. C # và trình biên dịch của nó không có khả năng theo dõi và hiệu quả như người ta biết từ JAVA, trong đó một lớp / phương thức nhất định được sử dụng càng nhanh thì nó càng chạy nhanh và việc sử dụng nó trở nên 'được dự đoán'. C # đơn giản là không có điều đó, vì vậy, để phân biệt, hãy sử dụng CẤU TRÚC thay vì LỚP.