2009-12-05 7 views
47

संभव डुप्लिकेट:
Enum with stringsसी #: स्ट्रिंग स्थिरांक भंडारण के लिए enum का उपयोग कैसे करें?

है अगर ऐसा नहीं है कि क्या ऐसा करने के लिए सबसे अच्छा तरीका है की तरह

 enum{name1="hmmm" name2="bdidwe"} 

enum में स्ट्रिंग स्थिरांक करना संभव है?

मैंने कोशिश की यह स्ट्रिंग के लिए अपने काम नहीं कर रहा तो अभी मैं की तरह

 class operation 
     { 
      public const string name1="hmmm"; 
      public const string name2="bdidwe" 
     } 
+0

सटीक अनुलिपि http://stackoverflow.com/questions/630803/enum-with-strings –

+0

स्ट्रिंग [] दिन = {"یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنج شنبه", " جمعه "," شنبه ",}; int i = (int) obj.GetDayOfWeek (डीटी); स्ट्रिंग डेनाम = दिन [i]; –

उत्तर

92

Enum स्थिरांक केवल क्रमसूचक प्रकार (int डिफ़ॉल्ट रूप से) का हो सकता है, तो आप enums में स्ट्रिंग स्थिरांक नहीं हो सकता।

जब मुझे "स्ट्रिंग-आधारित एनम" की तरह कुछ चाहिए, तो मैं आपके जैसे स्थिरांक को पकड़ने के लिए एक कक्षा बनाउंगा, सिवाय इसके कि मैं इसे अवांछित तत्कालता और अवांछित सबक्लासिंग को रोकने के लिए एक स्थिर वर्ग बना देता हूं।

लेकिन तुम विधि हस्ताक्षर में प्रकार के रूप में स्ट्रिंग का उपयोग नहीं करना चाहते हैं और आप एक सुरक्षित, अधिक प्रतिबंधात्मक प्रकार (Operation) की तरह पसंद करते हैं, आप सुरक्षित enum पैटर्न का उपयोग कर सकते हैं:

public sealed class Operation 
{ 
    public static readonly Operation Name1 = new Operation("Name1"); 
    public static readonly Operation Name2 = new Operation("Name2"); 

    private Operation(string value) 
    { 
     Value = value; 
    } 

    public string Value { get; private set; } 
} 
+1

यह वास्तव में अद्भुत लगता है। धन्यवाद –

+17

+1 पूरी तरह फिट करें। उस अंतर्निहित परिचालन में जोड़ें, और आप सुनहरे हैं: 'सार्वजनिक स्थिर अंतर्निहित ऑपरेटर स्ट्रिंग (ऑपरेशन सेशन) {वापसी op.Value; } 'क्योंकि तब आप इसे दृढ़ता से टाइप किए गए पैरामीटर के रूप में या स्ट्रिंग के रूप में उपयोग कर सकते हैं। –

+0

लेकिन उपर्युक्त पैटर्न का उपयोग करना संभव नहीं है जहां स्ट्रिंग स्थिरांक की आवश्यकता होती है, उदाहरण के लिए, स्विच ..केस स्टेटस – ghd

0

आपका operation वर्ग एक कक्षा में सभी संबंधित constnats समूहीकरण हूँ उसी रूप में संकलन नहीं होगा ... आप यह घोषणा नहीं की थी name1 और name2 का प्रकार ...

लेकिन यह वह दृष्टिकोण है जो मैं लेता हूं ... हाँ।

आप इसे एक struct करते हैं तो यह एक मान प्रकार जो या नहीं हो सकता है कि तुम क्या चाहते थे ...

+0

मैं इसे यहां टाइप करना भूल गया अन्यथा यह ठीक है। मैं स्ट्रिंग स्थिरांक रखने के लिए सही दृष्टिकोण के बारे में चिंतित हूं। –

+0

हां, मैं शायद उन पंक्तियों के साथ कुछ भी करूंगा। –

4

enums के पूरे मुद्दे क्रमसूचक स्थिरांक हो रहा है हो जाता है।
लेकिन, आप प्राप्त कर सकते हैं कि आप क्या चाहते एक विस्तार विधि का उपयोग कर:

enum Operation 
    { 
     name1, 
     name2 
    } 

    static class OperationTextExtender 
    { 
     public static String AsText(this Operation operation) 
     { 
       switch(operation) 
       { 
        case Operation.name1: return "hmmm"; 
        case Operation.name2: return "bdidwe"; 
        ... 
       } 
     } 
    } 

    ... 
    var test1 = Operation.name1; 
    var test2 = test1.AsText(); 
+0

मुझे सच में आश्चर्य है कि क्या आप कभी भी वास्तविक दुनिया कोड में इस तरह की एक बंद एक्सटेंशन विधि का उपयोग करेंगे? (उस प्रश्न में कोई कटाक्ष नहीं है)। यह जानना दिलचस्प है कि यह किया जा सकता है। – BillW

+0

मेरे पास एक स्निपेट है जो ध्वज enums के लिए एक तत्व और निकालें विधि के साथ विस्तार कक्षाएं बनाता है। मैं नहीं चाहता कि यह सार्वजनिक एपीआई का हिस्सा बन जाए, इसलिए यह आंतरिक है। लेकिन मैं इसे काफी बार और अंतर्निर्मित झंडे के लिए भी उपयोग करता हूं, विशेष रूप से "युक्त"। –

+0

@RobertGiesecke बस आपको इस समाधान के लिए कुडोस देना चाहता था। विस्तार करने के लिए विस्तार विधि मेरे लिए एक आदर्श और सुरुचिपूर्ण तरीका था!अन्य समाधान enums से बचने के लिए थे, लेकिन इस समाधान ने मुझे विस्तार करने की अनुमति दी और यह कार्य को जटिल बनाने में ओवरबोर्ड पर जाने के बिना सही काम किया क्योंकि अधिकांश समाधान किए गए .. – Mike

36

आप इस DescriptionAttribute का उपयोग कर सकता है, लेकिन फिर आप स्ट्रिंग विशेषता से बाहर निकलने के कोड लिखने के लिए होगा।

public enum YourEnum 
{ 
    [Description("YourName1")] 
    Name1, 

    [Description("YourName2")] 
    Name2 
} 
+2

+1 पहली बार विवरण विशेषता में आ रहा है। धन्यवाद :) –

+0

विशेषता से स्ट्रिंग कैसे प्राप्त करें? –

+0

अभी तक एकमात्र उत्तर +1 है जिसने इस स्थिति को लिया है कि ओपी का इरादा ऐसा कुछ है जिसमें एनम प्रकार की संभावनाओं की पूरी श्रृंखला हो। – BillW