স্ট্রিং বা ইনট দ্বারা কীভাবে এনাম মান পাবেন


108

আমি যদি এনাম স্ট্রিং বা এনাম ইনট মান পাই তবে আমি কীভাবে এনাম মান পেতে পারি। উদাহরণস্বরূপ: যদি আমার নীচে এনাম থাকে:

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

এবং কিছু স্ট্রিং ভেরিয়েবলে আমার মান "মান 1" নিম্নরূপ:

string str = "Value1" 

অথবা কিছুটা ভেরিয়েবলে আমার মান 2 এর মতো হয়

int a = 2;

আমি কীভাবে এনামের উদাহরণ পেতে পারি? আমি একটি জেনেরিক পদ্ধতি চাই যেখানে এনাম উদাহরণটি পেতে আমি এনাম এবং আমার ইনপুট স্ট্রিং বা ইনট মান সরবরাহ করতে পারি।


উত্তর:


210

না, আপনি জেনেরিক পদ্ধতি চান না। এটি অনেক সহজ:

MyEnum myEnum = (MyEnum)myInt;

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

আমি মনে করি এটি আরও দ্রুত হবে।


এটি আসলে এটি করার সঠিক উপায়। কেন কোনও আইপিআরসেবল ইন্টারফেস নেই সেই কারণেই ধরণের পার্স করার কোনও জেনেরিক উপায় নেই।
জোহানেস

4
@ জোহনেস তার মানে কী? একটি সাধারণ উপায় আছে, আমার উত্তর এবং অন্যদেরও উল্লেখ করুন।
শ্রীরাম সাক্তিভেল

4
@ শ্রীরামস্যাকটিভেল ওপি বর্ণনা করে যে সমস্যাটি কেন্ডলফ্রে দেখিয়েছে ঠিক সেভাবেই তা সমাধান করা হয়েছে। জেনেরিক পার্সিং করা যায় না - এখানে দেখুন: informit.com/blogs/blog.aspx?uk=Why-no-IParseable-interface । সি # এর "অনবোর্ড" সমাধানের তুলনায় অন্য কোনও সমাধানের কোনও সুবিধা নেই। আপনি যে সর্বাধিক থাকতে পারেন তা হ'ল একটি আইসিএনসেটফ্রমস্ট্রিং <টি> যেখানে আপনি কোনও ডিফল্ট (টি) এবং একটি প্রতিনিধি স্ট্রিংয়ের পরবর্তী ধাপে পাস করে কোনও অবজেক্ট তৈরি এবং সূচনা করেন। এটি ওপি যে উত্তর দিয়েছে তার খুব কাছাকাছি - তবে এটি অর্থহীন কারণ সাধারণত এটি একটি ডিজাইনের সমস্যা এবং সিস্টেম ডিজাইনের একটি বৃহত পয়েন্ট মিস হয়ে যায়।
জোহানেস

এই উত্তরটি খুব ভালভাবে কাজ করেছে, বিশেষত কোনও আন্ত এবং স্ট্রিং ব্যবহারের একাধিক উদাহরণ সহ। ধন্যবাদ.
টার্মো

4
আমি মনে করি এটি এখন কাজ করে, এটি খানিকটা সংক্ষিপ্ত: এনাম. পার্স <মায়ানাম> (মাই স্ট্রিং);
ফিল বি

32

এটি করার বিভিন্ন উপায় রয়েছে তবে আপনি যদি একটি সাধারণ উদাহরণ চান তবে এটি করবে do প্রকার সুরক্ষা এবং অবৈধ পার্সিং ইত্যাদির জন্য এটি পরীক্ষা করতে প্রয়োজনীয় ডিফেন্সিভ কোডিং দিয়ে বাড়ানো দরকার etc.

    /// <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প্যারামিটার ধরণের আগে যোগ করে এটি খুব সহজেই একটি এক্সটেনশন পদ্ধতিতে তৈরি করতে পারেন ।


4
এখন thisপ্যারামিটারে একটি যুক্ত করুন এবং EnumHelperস্ট্যাটিক করুন এবং আপনি এগুলি এক্সটেনশন হিসাবেও ব্যবহার করতে পারেন (আমার উত্তর দেখুন, তবে আপনার বিশ্রামের জন্য আরও ভাল / সম্পূর্ণ কোড রয়েছে) ...
ক্রিস্টোফ ফিঙ্ক

@ ক্রফিন ভাল ধারণা, তবে আমি এটিকে পছন্দ করি না কারণ এটি ইন্টেলিজেন্সে পপিং হবে যেখানে আমাদের নাম ক্ষেত্র রয়েছে যখন এটি প্রয়োজন হয় না। আমার মনে হয় এটি বিরক্তিকর হবে।
শ্রীরাম সাক্তিভেল

4
@ chrfin মন্তব্যটির জন্য ধন্যবাদ, আমার উত্তরে একটি নোট হিসাবে যুক্ত হয়েছে।
শ্রীরাম সাক্তিভেল

5

স্ট্রিং দ্বারা এনাম মান পাওয়ার জন্য সি # তে থাকা পদ্ধতিটি নিম্নলিখিত

///
/// 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;
}

সি # তে এনটাম দ্বারা এনাম মান পেতে নিম্নলিখিত পদ্ধতিটি নিম্নলিখিত।

///
/// 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> (ইনটভ্যালু) এ সংশোধন করতে হয়েছিল যেখানে টি: স্ট্রাক্ট, আইকনভার্টেবলও শেষে '}' সম্পর্কে সতর্ক থাকুন
আভি

3

আমি মনে করি আপনি জেনেরিক ধরণের সংজ্ঞাটি ভুলে গেছেন:

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

এবং আপনি এটিকে সবচেয়ে দৃin় বিশ্বাসের হিসাবে উন্নত করতে পারেন যেমন:

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

এসকিউএল ডাটাবেস থেকে এনাম মতো পান:

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...");
    }

দ্রষ্টব্য: এই পদ্ধতিটি কেবলমাত্র একটি নমুনা এবং আপনি এটি উন্নত করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.