วิธีการภายใน enum ใน C #


165

ใน Java เป็นไปได้ที่จะมีวิธีการภายใน enum

มีความเป็นไปได้เช่นนี้ใน C # หรือเป็นเพียงแค่การรวบรวมสตริงและนั่นคืออะไร

ฉันพยายามที่จะแทนที่ToString()แต่มันไม่ได้รวบรวม มีใครมีตัวอย่างรหัสง่ายๆ?


ฉันไม่คิดว่าคุณสามารถมีวิธีการภายใน Enum ใน C # คุณพยายามจะทำอะไร?
Duncan Howe

พยายามที่จะรับพฤติกรรม Java และสรุปตรรกะปิดเพื่อ Enums อย่างไรก็ตามฉันเห็นจากคำตอบที่เป็นไปไม่ได้ - ฉันจะใช้ส่วนขยาย
Eya

คำตอบ:


272

คุณสามารถเขียนวิธีการขยายสำหรับประเภท 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

อีกตัวเลือกหนึ่งคือการใช้ระดับการแจงนับที่สร้างขึ้นโดยจิมมี่ Bogard

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

แม้ว่าการใช้งานนี้ไม่ได้มีอยู่ในภาษา แต่ไวยากรณ์ (การสร้างและการใช้งาน) ค่อนข้างใกล้เคียงกับภาษาที่ใช้ enums ดีกว่า C # ( ตัวอย่างเช่นKotlin )


3

Nope คุณสามารถสร้างชั้นแล้วเพิ่มพวงของคุณสมบัติในชั้นเรียนจะค่อนข้างเลียนแบบ enum แต่ thats ไม่ได้จริงๆในสิ่งเดียวกัน

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

รูปแบบที่ดีกว่าคือการใส่วิธีการของคุณในชั้นเรียนแยกจากอีมูมของคุณ


0

ตั้งแต่ฉันเจอและต้องการสิ่งที่ตรงกันข้ามกับ enum ถึง string นี่คือคำตอบทั่วไป:

static class EnumExtensions {
    public static T GetEnum<T>(this string itemName) {
        return (T) Enum.Parse(typeof(T), itemName, true);
    }
}

สิ่งนี้ยังไม่สนใจเคสและเป็นประโยชน์อย่างยิ่งสำหรับการวิเคราะห์คำตอบ REST-to กับ enum ของคุณเพื่อความปลอดภัยที่มากขึ้น หวังว่ามันจะช่วยให้ใครบางคน


-15

C # ไม่อนุญาตให้ใช้วิธีการในการแจงนับเนื่องจากไม่ใช่หลักการที่ใช้ในคลาส แต่เป็นอาร์เรย์ 2 มิติที่มีสตริงและค่า

การใช้คลาสไม่ได้รับการสนับสนุนอย่างสูงจาก Microsoft ในกรณีนี้ให้ใช้ (data) struct (ures) แทน STRUCT มีจุดประสงค์เพื่อใช้เป็นคลาสแบบอ่อนสำหรับข้อมูลและตัวจัดการและสามารถจัดการฟังก์ชันได้อย่างดี C # และคอมไพเลอร์ไม่มีความสามารถในการติดตามและประสิทธิภาพตามที่ทราบจาก JAVA ซึ่งยิ่งมีการใช้คลาส / วิธีที่แน่นอนมากเท่าไหร่มันก็จะทำงานได้เร็วขึ้นและการใช้งานจะกลายเป็น 'คาดการณ์' C # ไม่มีสิ่งนั้นดังนั้นเพื่อแยกแยะใช้ STRUCT แทนที่จะเป็นคลาส


7
เจ็ดลงคะแนนโดยไม่ต้องแสดงความคิดเห็นเดียวที่จะอธิบายสิ่งที่ควรจะผิดกับคำตอบนี้หรือไม่? พวก C'mon ...
คืนที่ดี Nerd ความภาคภูมิใจ

ข้อมูลทั้งหมดที่ให้ไว้ในโพสต์นี้ผิดหรือเปล่า?
VK

5
ส่วนนี้เป็นจริง: C # ไม่อนุญาตให้ใช้วิธีการในการแจงนับ ฉันไม่แน่ใจว่าเหตุผลนั้นถูกต้องหรือไม่และย่อหน้าที่สองนั้นดูไม่เกี่ยวข้องกับคำถามทั้งหมด หากมีวิธีการใช้ struct เพื่อจำลอง enum ที่มีพฤติกรรมการให้ตัวอย่างจะดีที่สุด
Mishelle

3
ฉันคิดว่านัยที่ชัดเจน อย่าแทนที่ enum (ซึ่งเป็นประเภทค่า) ด้วยคลาส (ซึ่งเป็นประเภทการอ้างอิง) เพียงเพื่อเพิ่มวิธีการเนื่องจาก structs ยังสามารถมีวิธีการและยังเป็นประเภทค่า
smelch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.