सी # में एनम के अंदर तरीके


165

जावा में, किसी एनम के अंदर तरीके होना संभव है।

क्या C # में ऐसी संभावना है या यह सिर्फ एक स्ट्रिंग संग्रह है और यह है?

मैंने ओवरराइड करने की कोशिश की ToString()लेकिन यह संकलन नहीं है। क्या किसी के पास एक सरल कोड नमूना है?


मुझे नहीं लगता कि आपके पास C # में Enum के अंदर के तरीके हो सकते हैं। तुम क्या करने की कोशिश कर रहे हो?
डंकन हॉवे

जावा व्यवहार प्राप्त करने और Enums में करीबी तर्क देने की कोशिश कर रहा है। वैसे भी मैं उन उत्तरों से देखता हूं जो संभव नहीं है - मैं विस्तार को लागू करूंगा।
ईया

जवाबों:


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

एक अन्य विकल्प जिमी बोगार्ड द्वारा निर्मित एन्यूमरेशन क्लास का उपयोग करना है ।

मूल रूप से, आपको एक ऐसा वर्ग बनाना होगा जो उससे विरासत में मिला हो 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}!";
    }
}

फिर आप इसे एक एनुम की तरह उपयोग कर सकते हैं, इसके अंदर तरीकों को डालने की संभावना के साथ (अन्य चीजों के बीच):

EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager

आप इसे NuGet के साथ डाउनलोड कर सकते हैं ।

यद्यपि यह कार्यान्वयन भाषा में मूल नहीं है, वाक्यविन्यास (निर्माण और उपयोग) उन भाषाओं के बहुत करीब है जो एनमों को मूल रूप से C # से बेहतर लागू करते हैं ( उदाहरण के लिए कोटलिन )।


3

नहीं। तुम्हें पता है, एक वर्ग बना सकते हैं तो वर्ग के लिए गुण का एक समूह जोड़ने के लिए कुछ हद तक एक 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

जब से मैं आया था, और स्ट्रिंग के लिए एनम के सटीक विपरीत की आवश्यकता थी, यहाँ एक सामान्य समाधान है:

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

यह मामले को भी नजरअंदाज करता है और अधिक प्रकार की सुरक्षा प्राप्त करने के लिए आपके एनम के लिए रेस्ट-रिस्पांस को पार्स करने के लिए बहुत आसान है। उम्मीद है कि यह किसी की मदद करता है


-15

सी # एन्यूमरेटरों में विधियों के उपयोग की अनुमति नहीं देता है क्योंकि यह एक वर्ग आधारित सिद्धांत नहीं है, बल्कि एक स्ट्रिंग और मूल्य के साथ 2 आयामी सरणी है।

Microsoft द्वारा इस मामले में कक्षाओं का उपयोग अत्यधिक हतोत्साहित किया जाता है, इसके बजाय (डेटा) संरचना (ures) का उपयोग करें; STRUCT का उद्देश्य डेटा और उसके हैंडलर्स के लिए एक हल्के वर्ग के रूप में है और यह ठीक काम कर सकता है। C # और इसके कंपाइलर में JAVA से पता चलता है कि ट्रैकिंग और दक्षता की क्षमता नहीं है, जहाँ जितनी बार एक निश्चित वर्ग / विधि का उपयोग किया जाता है उतनी तेज़ी से चलता है और इसका उपयोग 'प्रत्याशित' हो जाता है। C # के पास ऐसा नहीं है, इसलिए अंतर करने के लिए CLASS के बजाय STRUCT का उपयोग करें।


7
एक भी टिप्पणी के बिना सात डाउन वोट यह समझाने के लिए कि क्या गलत है? C'mon लोग ...
गुड नाइट नर्ड प्राइड

क्या इस पोस्ट में दी गई सारी जानकारी गलत है?
वीके

5
यह भाग सत्य है: C # एन्यूमरेटर्स में विधियों के उपयोग की अनुमति नहीं देता है। मुझे यकीन नहीं है कि अगर तर्क सही है, और दूसरा पैराग्राफ पूरी तरह से सवाल के लिए अप्रासंगिक लगता है। यदि व्यवहार के साथ किसी एनम का अनुकरण करने के लिए एक संरचना का उपयोग करने का एक तरीका है, तो एक उदाहरण प्रदान करना सबसे अच्छा होगा।
Mishelle

3
मुझे लगता है कि यहाँ निहितार्थ बिल्कुल स्पष्ट हैं। एक वर्ग के साथ एक एनुम (जो एक मान प्रकार है) को प्रतिस्थापित न करें (जो कि एक संदर्भ प्रकार है) केवल विधियों को जोड़ने के लिए, क्योंकि संरचना में तरीके भी हो सकते हैं और मूल्य प्रकार भी होते हैं।
29:17
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.