2011-11-01 11 views
12

मूल रूप से शीर्षक की एक श्रृंखला स्विच स्टेटमेंट में पारित की जाएगी और मुझे उन्हें enum के स्ट्रिंग मानों के विरुद्ध तुलना करने की आवश्यकता है। लेकिन मुझे यह नहीं पता कि यह सही तरीके से कैसे किया जाए।एनएमएस के लिए स्ट्रिंग मानों को कैसे असाइन करें और स्विच में उस मान का उपयोग करें

इसके अलावा, मुझे नहीं पता कि यह भी सबसे अच्छा तरीका है ताकि किसी के पास कोई विचार हो?

उदाहरण के लिए:

enum 
{ 
    doctor = "doctor", 
    mr = "mr", 
    mrs = "mrs" 
} 

और फिर स्ट्रिंग मान मैं उन्हें सौंपा गया है के माध्यम से स्विच करें।

उत्तर

9

आप string का एक अंतर्निहित प्रकार वाला enum नहीं हो सकता। The underlying type can be any integral type except char

आप एक string को अनुवाद करना चाहते हैं अपने enum तो आप शायद Parse या TryParse विधियों का उपयोग करने की आवश्यकता होगी।

string incoming = "doctor"; 

// throws an exception if the string can't be parsed as a TestEnum 
TestEnum foo = (TestEnum)Enum.Parse(typeof(TestEnum), incoming, true); 

// try to parse the string as a TestEnum without throwing an exception 
TestEnum bar; 
if (Enum.TryParse(incoming, true, out bar)) 
{ 
    // success 
} 
else 
{ 
    // the string isn't an element of TestEnum 
} 

// ... 

enum TestEnum 
{ 
    Doctor, Mr, Mrs 
} 
0

समझने के लिए कि कैसे enums काम करते हैं this tutorial पढ़ें। switch बयान के उदाहरण भी हैं।

+0

मैंने स्किम किए गए मूल्यों को असाइन करने के बारे में कुछ भी नहीं देखा। – ediblecode

3

अंकन स्ट्रिंग प्रकार का नहीं हो सकता है।

एक enum के लिए अनुमोदित प्रकार बाइट, sbyte, लघु, ushort, int, uint, long, या ulong हैं।

http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

+0

मैंने यह नहीं कहा था कि मैं इसे टाइप स्ट्रिंग का होना चाहता था। मैंने कहा कि मैं इसे एक स्ट्रिंग मान असाइन करना चाहता था। मैंने इसे पहले देखा है और यह जानना चाहता था कि इसे कैसे कार्यान्वित किया जाए। – ediblecode

+0

मेरी माफी माँगने के बाद, मैंने इसे एक ही चीज़ के रूप में पढ़ा क्योंकि अंतर्निहित मूल्य enum के प्रकार हैं। – Jay

4

यह ऐसी चीज नहीं है जिसे हार्ड-कोड किया जाना चाहिए। यह डेटा-संचालित होना चाहिए, संभावित रूप से बाहरी फ़ाइल या डेटाबेस से पढ़ा जाना चाहिए। आप उन्हें Dictionary में स्टोर कर सकते हैं और अपने तर्क को चलाने के लिए कुंजी का उपयोग कर सकते हैं।

+0

मैंने ऐसा सोचा। धन्यवाद – ediblecode

+0

हार्ड-कोडिंग एनम विवरण वास्तविक दुनिया डोमेन ऑब्जेक्ट्स के बाद कक्षाओं के नामकरण से अधिक गलत नहीं है। कभी-कभी एक मछली। बेबेलफ़िश हमेशा "बेबेल मछली" होगी। एक स्थानीय संसाधन (वैश्वीकरण के लिए) से मूल्य प्राप्त करने के लिए एक मामला बनाया जा सकता है, लेकिन आपको डेटाबेस या बाहरी फ़ाइल से जानकारी का हर टुकड़ा प्राप्त करने की आवश्यकता नहीं है। –

3

एनम में केवल अभिन्न अंतर्निहित प्रकार (चार को छोड़कर) हो सकते हैं। इसलिए आप कम से कम सीधे, जो भी चाहते हैं वह नहीं कर सकते हैं।

लेकिन अगर आप स्ट्रिंग enum प्रकार के आप अनुवाद कर सकते हैं:

EnumType eVal = (EnumType)Enum.Parse(typeof(EnumType), strValue); 

switch(eVal) 
{ 
    case EnumType.doctor:/*...*/; break; 
    case EnumType.mr: /*...*/; break; 
} 
1

सिर्फ शुद्ध enum और स्विच का उपयोग करने के क्यों नहीं?

enum Prefix 
{ 
    doctor, 
    mr, 
    mrs 
} 

तो आप उपयोग कर सकते है

तरह
string case = "doctor"; 

switch ((Prefix)Enum.Parse(typeof(Prefix), "doctor")) 
{ 
    case Prefix.doctor: 
     ... 
     break; 
    ... 
    default: 
     break; 
} 
+0

enums एक शब्द होना चाहिए, उदाहरण के लिए लांस कॉरपोरल, मुझे – ediblecode

+1

समस्याएं पैदा कर सकती हैं, आप एक नक्शा 'शब्दकोश <स्ट्रिंग, उपसर्ग> मानचित्र' बना सकते हैं, इसे भर सकते हैं, फिर एक स्ट्रिंग "लांस कॉरपोरल" को उचित एनम मूल्य मिल सकता है (जैसे 'उपसर्ग पी = मानचित्र ["लांस कॉरपोरल"];') और enum प्रकार पर एक स्विच करें। –

2

मेरा मानना ​​है कि ऐसा करने के लिए मानक तरीका केवल पढ़ने के लिए स्ट्रिंग गुण है कि मूल्य आप चाहते हैं वापसी के साथ एक स्थिर वर्ग का प्रयोग है।

16

मुझे पता चला कि ऐसा करने के लिए मेरे लिए सबसे अच्छा तरीका System.ComponentModel. enum मानों पर डिस्क्रिप्शन विशेषता का उपयोग कर है।

using System.ComponentModel; 

public enum ActionCode 
{ 
    [Description("E")] 
    Edit, 
    [Description("D")] 
    Delete, 
    [Description("R")] 
    Restore 
} 

फिर, इसका इस्तेमाल करने की, एक विस्तार विधि एक स्थिर वर्ग पर तो जैसे बनाने के लिए::

संपादित करें:

यहाँ एक उदाहरण है मैं एक सामान्य विस्तार पद्धति के रूप में मूल कोड दुबारा लिखा IConvertible लागू करने वाली कक्षा पर (Enum इस इंटरफ़ेस को लागू करता है, इसलिए यह जिस तरीके से हमें इसकी आवश्यकता है)।

public static string GetDescription<T>(this T e) where T : IConvertible 
{ 
    if (e is Enum) 
    { 
     Type type = e.GetType(); 
     Array values = System.Enum.GetValues(type); 

     foreach (int val in values) 
     { 
      if (val == e.ToInt32(CultureInfo.InvariantCulture)) 
      { 
       var memInfo = type.GetMember(type.GetEnumName(val)); 
       var descriptionAttribute = memInfo[0] 
        .GetCustomAttributes(typeof(DescriptionAttribute), false) 
        .FirstOrDefault() as DescriptionAttribute; 

       if (descriptionAttribute != null) 
       { 
        return descriptionAttribute.Description; 
       } 
      } 
     } 
    } 

    return null; // could also return string.Empty 
} 

तो, स्ट्रिंग ऊपर हमारे enum के साथ जुड़े पाने के लिए, हम निम्नलिखित कोड का उपयोग कर सकता:

using Your.Extension.Method.Namespace; 

... 

ActionCode action = ActionCode.Edit; 
string actionDescription = action.GetDescription(); 

// value of actionDescription will be "E" 

यहाँ एक और है यहाँ एक सामान्य विधि है कि सभी enums पर काम करता है नमूना Enum:

:

public enum TestEnum 
{ 
    [Description("This is test 1")] 
    Test1, 
    [Description("This is test 2")] 
    Test2, 
    [Description("This is test 3")] 
    Test3 

} 

यहाँ विवरण देखने के लिए कोड है

TestEnum test = TestEnum.Test2; 
var testDescription = test.GetDescription(); 

परिणाम होगा:

"This is test 2" 

मैं आगे जाना है और सामान्य विधि पोस्ट के रूप में यह बहुत अधिक उपयोगी है चाहता था। यह आपको अपने सभी enums के लिए एक कस्टम एक्सटेंशन लिखने से रोकता है।

+0

विवरण के साथ बढ़िया है – MonsterMMORPG

1

मैं सी # 6 या उससे अधिक का उपयोग कर किसी के लिए एक और जवाब जोड़ना चाहता था।

आप केवल Enum मान का नाम पाने के लिए इच्छुक रहे हैं, तो आप नए nameof() विधि सी # 6.

string enumName = nameof(MyEnum.EnumVal1); // enumName will equal "EnumVal1" 

में पेश इस्तेमाल कर सकते हैं यह पहली नज़र में overkill की तरह लग सकता है (क्यों स्ट्रिंग के मान को "EnumVal1" से शुरू करने के लिए बस सेट न करें?), यह सुनिश्चित करने के लिए कि यह मान वैध है, यह आपको संकलन-समय जांच देगा। इसलिए, यदि आपने कभी भी एनम मान का नाम बदल दिया है और सभी संदर्भों को ढूंढने और बदलने के लिए अपना आईडीई बताना भूल जाते हैं, तो यह तब तक संकलित नहीं होगा जब तक कि आप उन्हें ठीक न करें।

संबंधित मुद्दे