स्ट्रिंग या इंट द्वारा एनम मूल्य कैसे प्राप्त करें


108

अगर मेरे पास एनम स्ट्रिंग या एनम इंट वैल्यू है तो मैं एनम वैल्यू कैसे प्राप्त कर सकता हूं। उदाहरण: यदि मेरे पास एक एनम निम्नानुसार है:

public enum TestEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 3
}

और कुछ स्ट्रिंग वैरिएबल में मेरा मान "value1" इस प्रकार है:

string str = "Value1" 

या कुछ इंट वैरिएबल में मेरा मूल्य 2 जैसा है

int a = 2;

मैं enum का उदाहरण कैसे प्राप्त कर सकता हूं? मैं एक सामान्य विधि चाहता हूं जहां मैं एनम उदाहरण के लिए एनम और मेरे इनपुट स्ट्रिंग या इंट वैल्यू प्रदान कर सकता हूं।


जवाबों:


211

नहीं, आप एक सामान्य विधि नहीं चाहते हैं। यह बहुत आसान है:

MyEnum myEnum = (MyEnum)myInt;

MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), myString);

मुझे लगता है कि यह भी तेज होगा।


यह वास्तव में ऐसा करने का सही तरीका है। IParsable इंटरफ़ेस न होने के कारण समान प्रकार के पार्स करने का कोई सामान्य तरीका नहीं है।
जोहान्स

1
@ जोहान्स इससे आपका क्या मतलब है? एक सामान्य तरीका है, मेरे उत्तर को देखें और अन्य को भी।
श्रीराम सक्तीवेल

1
@ श्रीरामसैथिवेल ने ओपी द्वारा बताई गई समस्या को हल किया जैसे कि केंडलफ्रे ने दिखाया। जेनेरिक पार्सिंग नहीं की जा सकती - यहाँ देखें: Informit.com/blogs/blog.aspx?uk=Why-no-IParseable-interface । सी # के "ऑनबोर्ड" समाधान की तुलना में किसी अन्य समाधान का कोई लाभ नहीं है। अधिकतम आपके पास एक ICanSetFromString <T> हो सकता है जहां आप एक वस्तु बनाते हैं और उसके डिफ़ॉल्ट (T) पर एक ऑब्जेक्ट बनाते हैं और एक प्रतिनिधि स्ट्रिंग में अगले चरण पास करते हैं। यह ओपी द्वारा दिए गए उत्तर के करीब है - लेकिन यह व्यर्थ है क्योंकि आमतौर पर यह एक डिजाइन मुद्दा है और सिस्टम डिजाइन में एक बड़ा बिंदु चूक गया था।
जोहान्स

इस उत्तर ने बहुत अच्छा काम किया, विशेष रूप से एक इंट और स्ट्रिंग उपयोग के कई उदाहरणों के साथ। धन्यवाद।
टर्मो

1
मुझे लगता है कि अब यह काम करता है, यह थोड़ा अधिक संक्षिप्त है: Enum.Parse <MyEnum> (myString);
फिल बी

32

ऐसा करने के कई तरीके हैं, लेकिन यदि आप एक सरल उदाहरण चाहते हैं, तो यह होगा। इसे बस प्रकार की सुरक्षा और अमान्य पार्सिंग इत्यादि की जांच के लिए आवश्यक रक्षात्मक कोडिंग के साथ बढ़ाया जाना चाहिए।

    /// <summary>
    /// Extension method to return an enum value of type T for the given string.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static T ToEnum<T>(this string value)
    {
        return (T) Enum.Parse(typeof(T), value, true);
    }

    /// <summary>
    /// Extension method to return an enum value of type T for the given int.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static T ToEnum<T>(this int value)
    {
        var name = Enum.GetName(typeof(T), value);
        return name.ToEnum<T>();
    }

17

अगर आप का उपयोग बहुत सरल हो सकता है TryParseया Parseऔर ToObjectतरीकों।

public static class EnumHelper
{
    public static  T GetEnumValue<T>(string str) where T : struct, IConvertible
    {
        Type enumType = typeof(T);
        if (!enumType.IsEnum)
        {
            throw new Exception("T must be an Enumeration type.");
        }
        T val;
        return Enum.TryParse<T>(str, true, out val) ? val : default(T);
    }

    public static T GetEnumValue<T>(int intValue) where T : struct, IConvertible
    {
        Type enumType = typeof(T);
        if (!enumType.IsEnum)
        {
            throw new Exception("T must be an Enumeration type.");
        }

        return (T)Enum.ToObject(enumType, intValue);
    }
}

जैसा कि टिप्पणियों में @chrfin द्वारा उल्लेख किया गया है, आप इसे thisपैरामीटर प्रकार से पहले जोड़कर बहुत आसानी से एक विस्तार विधि बना सकते हैं जो कि काम में आ सकती है।


2
अब एक thisपैरामीटर भी जोड़ें और EnumHelperस्टेटिक बनाएं और आप उन्हें एक्सटेंशन के रूप में भी उपयोग कर सकते हैं (मेरा उत्तर देखें, लेकिन आपके पास बाकी के लिए बेहतर / पूर्ण कोड है ...)
क्रिस्टोफ़ फ़िंक

@chrfin अच्छा विचार है, लेकिन मैं इसे पसंद नहीं करता हूं क्योंकि यह इंटेलीजेंस में पॉपिंग होगा जहां यह आवश्यक नहीं है जब हमारे पास स्कोप में नाम स्थान हैं। मुझे लगता है यह कष्टप्रद होगा।
श्रीराम सक्तीवेल

1
@chrfin टिप्पणी के लिए धन्यवाद, मेरे उत्तर में एक नोट के रूप में जोड़ा गया।
श्रीराम सक्तीवेल

5

स्ट्रिंग द्वारा enum मान प्राप्त करने के लिए C # में विधि है

///
/// Method to get enumeration value from string value.
///
///
///

public T GetEnumValue<T>(string str) where T : struct, IConvertible
{
    if (!typeof(T).IsEnum)
    {
        throw new Exception("T must be an Enumeration type.");
    }
    T val = ((T[])Enum.GetValues(typeof(T)))[0];
    if (!string.IsNullOrEmpty(str))
    {
        foreach (T enumValue in (T[])Enum.GetValues(typeof(T)))
        {
            if (enumValue.ToString().ToUpper().Equals(str.ToUpper()))
            {
                val = enumValue;
                break;
            }
        }
    }

    return val;
}

निम्नलिखित सी # में विधि है जो int द्वारा enum मान प्राप्त करने के लिए है।

///
/// Method to get enumeration value from int value.
///
///
///

public T GetEnumValue<T>(int intValue) where T : struct, IConvertible
{
    if (!typeof(T).IsEnum)
    {
        throw new Exception("T must be an Enumeration type.");
    }
    T val = ((T[])Enum.GetValues(typeof(T)))[0];

    foreach (T enumValue in (T[])Enum.GetValues(typeof(T)))
    {
        if (Convert.ToInt32(enumValue).Equals(intValue))
        {
            val = enumValue;
            break;
        }             
    }
    return val;
}

यदि मेरे पास एक एनम निम्नानुसार है:

public enum TestEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 3
}

तो मैं उपरोक्त विधियों का उपयोग कर सकता हूं

TestEnum reqValue = GetEnumValue<TestEnum>("Value1");  // Output: Value1
TestEnum reqValue2 = GetEnumValue<TestEnum>(2);        // OutPut: Value2

आशा है कि यह मदद करेगा।


4
क्या आप यह भी बता सकते हैं कि आपको यह कहाँ से मिला है?
जोन्ह

इसे संकलित करने के लिए मुझे सार्वजनिक T GetEnumValue <T> (int intValue) के लिए पहली पंक्ति को संशोधित करना पड़ा, जहाँ T: संरचना, असंगत इसके अलावा एक अतिरिक्त '}' से सावधान रहें
Avi

3

मुझे लगता है कि आप सामान्य प्रकार की परिभाषा भूल गए:

public T GetEnumValue<T>(int intValue) where T : struct, IConvertible // <T> added

और आप इसे बेहतर कर सकते हैं जैसे कि यह सबसे अधिक विश्वसनीय है:

public static T ToEnum<T>(this string enumValue) : where T : struct, IConvertible
{
    return (T)Enum.Parse(typeof(T), enumValue);
}

तो आप कर सकते हैं:

TestEnum reqValue = "Value1".ToEnum<TestEnum>();

2

कुछ इस तरह की कोशिश करो

  public static TestEnum GetMyEnum(this string title)
        {    
            EnumBookType st;
            Enum.TryParse(title, out st);
            return st;          
         }

तो आप कर सकते हैं

TestEnum en = "Value1".GetMyEnum();

2

SQL डेटाबेस से enum प्राप्त करें जैसे:

SqlDataReader dr = selectCmd.ExecuteReader();
while (dr.Read()) {
   EnumType et = (EnumType)Enum.Parse(typeof(EnumType), dr.GetString(0));
   ....         
}

2

बस यह कोशिश करो

यह एक और तरीका है

public enum CaseOriginCode
{
    Web = 0,
    Email = 1,
    Telefoon = 2
}

public void setCaseOriginCode(string CaseOriginCode)
{
    int caseOriginCode = (int)(CaseOriginCode)Enum.Parse(typeof(CaseOriginCode), CaseOriginCode);
}

0

यहाँ स्ट्रिंग / मान प्राप्त करने के लिए एक उदाहरण है

    public enum Suit
    {
        Spades = 0x10,
        Hearts = 0x11,
        Clubs = 0x12,
        Diamonds = 0x13
    }

    private void print_suit()
    {
        foreach (var _suit in Enum.GetValues(typeof(Suit)))
        {
            int suitValue = (byte)(Suit)Enum.Parse(typeof(Suit), _suit.ToString());
            MessageBox.Show(_suit.ToString() + " value is 0x" + suitValue.ToString("X2"));
        }
    }

    Result of Message Boxes
    Spade value is 0x10
    Hearts value is 0x11
    Clubs value is 0x12
    Diamonds value is 0x13

0

आप ऐसा करने के लिए निम्नलिखित विधि का उपयोग कर सकते हैं:

public static Output GetEnumItem<Output, Input>(Input input)
    {
        //Output type checking...
        if (typeof(Output).BaseType != typeof(Enum))
            throw new Exception("Exception message...");

        //Input type checking: string type
        if (typeof(Input) == typeof(string))
            return (Output)Enum.Parse(typeof(Output), (dynamic)input);

        //Input type checking: Integer type
        if (typeof(Input) == typeof(Int16) ||
            typeof(Input) == typeof(Int32) ||
            typeof(Input) == typeof(Int64))

            return (Output)(dynamic)input;

        throw new Exception("Exception message...");
    }

नोट: यह विधि केवल एक नमूना है और आप इसे सुधार सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.