Các phương thức bên trong enum trong C #


165

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?


Tôi không nghĩ bạn có thể có các phương thức bên trong Enum trong C #. Bạn đang cố làm gì vậy?
Duncan Howe

cố gắng để có được hành vi Java và gói gọn logic gần với Enums. dù sao tôi thấy từ các câu trả lời là không thể - tôi sẽ triển khai các tiện ích mở rộng.
Eya

Câu trả lời:


272

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();
    }
}


11

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 ).


3

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.


0

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 đó


-15

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.


7
Bảy phiếu bầu mà không có một bình luận nào để giải thích điều gì được cho là sai với câu trả lời này? Thôi nào các bạn ...
Chúc ngủ ngon Nerd Pride

Là tất cả các thông tin được cung cấp trong bài viết này là sai?
VK

5
Phần này là đúng: C # Không cho phép sử dụng các phương thức trong liệt kê. Tôi không chắc liệu lý luận có đúng hay không, và đoạn thứ hai dường như hoàn toàn không liên quan đến câu hỏi. Nếu có cách sử dụng cấu trúc để mô phỏng enum với hành vi, cung cấp một ví dụ sẽ là tốt nhất.
Mishelle

3
Tôi nghĩ rằng những tác động khá rõ ràng ở đây. Không thay thế enum (là loại giá trị) bằng một lớp (là loại tham chiếu) chỉ để thêm phương thức, vì cấu trúc cũng có thể có phương thức và cũng là loại giá trị.
smelch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.