কীভাবে এনামকে কাস্ট করবেন?


3188

কীভাবে সি # intতে একটি কাস্ট করা যেতে পারে enum?

উত্তর:


3788

একটি স্ট্রিং থেকে:

YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString);

// The foo.ToString().Contains(",") check is necessary for enumerations marked with an [Flags] attribute
if (!Enum.IsDefined(typeof(YourEnum), foo) && !foo.ToString().Contains(","))
{
    throw new InvalidOperationException($"{yourString} is not an underlying value of the YourEnum enumeration.")
}

কোন ইনট থেকে:

YourEnum foo = (YourEnum)yourInt;

হালনাগাদ:

নম্বর থেকে আপনি করতে পারেন

YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt);

31
@ ফ্লাইসওয়াত, যদি YourEnumগতিশীল হয় এবং কেবল রানটাইমের সময় জানা যায়, এবং আমি কী রূপান্তর করতে চাই Enum?
শিমি ওয়েটজ্যান্ডলার

226
সচেতন থাকুন যে আপনার কোডটি অবলম্বন করা হলে এনাম.পার্স কাজ করবে না। অনড় হয়ে যাওয়ার পরে স্ট্রিংটিকে এনাম নামের সাথে তুলনা করা হয়, এবং এই মুহুর্তে এনামগুলির নামগুলি সেগুলি নয় যা আপনি তাদের কাছ থেকে প্রত্যাশা করতেন। আপনার পার্স ব্যর্থ হবে যেখানে ফলাফল হিসাবে তারা আগে সফল হয়েছিল।
jropella

158
সাবধান আপনি যদি উপরে "স্ট্রিং থেকে" সিনট্যাক্স ব্যবহার করেন এবং একটি অকার্যকর স্ট্রিংতে পাস করেন যা একটি সংখ্যা (যেমন "2342342" - এটি আপনার এনমের কোনও মান নয়) ধরে নিলে, এটি আসলে ত্রুটি ছুঁড়ে ছাড়াই অনুমতি দেবে! আপনার এনামের মানটি (2342342) থাকবে যদিও এটি এনামের মধ্যে বৈধ পছন্দ নয়।
জোকুল

132
আমি মনে করি এই উত্তরটি এখন কিছুটা তারিখের। স্ট্রিংয়ের জন্য, আপনার var result = Enum.TryParse(yourString, out yourEnum)আজকাল সত্যই ব্যবহার করা উচিত (এবং রূপান্তরটি ব্যর্থ হয়েছে কিনা তা নির্ধারণের জন্য ফলাফলটি পরীক্ষা করা উচিত )।
জাস্টিন টি কনরোয়

20
কলটিতে Enum.Parseএকটি trueপ্যারামিটার মান যুক্ত করে কেস-সংবেদনশীল হওয়াও সম্ভব :YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString, true);
এরিক শিয়েরবুম

899

কেবল এটি নিক্ষেপ করুন:

MyEnum e = (MyEnum)3;

এটি এনাম.আইএস সংজ্ঞায়িত করে এটির সীমার মধ্যে রয়েছে কিনা তা আপনি পরীক্ষা করতে পারেন :

if (Enum.IsDefined(typeof(MyEnum), 3)) { ... }

218
সতর্কতা অবলম্বন করুন আপনি এনাম ব্যবহার করতে পারবেন না sএসডিফাইনড আপনি যদি ফ্ল্যাগস অ্যাট্রিবিউট ব্যবহার করেন এবং মানটি পতাকাগুলির সংমিশ্রণ হিসাবে উদাহরণস্বরূপ: কীগুলি.এল | কী.কন্ট্রোল
dtroy

15
সম্পর্কিত Enum.IsDefined, সচেতন থাকুন যে এটি বিপজ্জনক হতে পারে: এমএসডিএন.ইমিক্রোসফটি.এইন
অ্যাড্রিয়ান

3
আমি এই সংজ্ঞাটি পছন্দ করি: এমএসডিএন থেকে "নির্দিষ্ট মানযুক্ত একটি ধ্রুবক একটি নির্দিষ্ট গণনায় বিদ্যমান কিনা তা একটি ইঙ্গিত ফেরত"
পাপ

3
... কারণ আপনার সংজ্ঞাটি বিভ্রান্তিমূলক হতে পারে, কারণ আপনি বলছেন: "... এটি সীমার মধ্যে আছে কিনা তা পরীক্ষা করুন ..." যা সূচনা এবং শেষের সীমা সহ একটি সংখ্যার সীমার মধ্যে বোঝায় ...
পাপ

3
@ mac9416 আমি একটি সংক্ষিপ্ত উদাহরণ দিতে চেষ্টা করেছি gist.github.com/alowdon/f7354cda97bac70b44e1c04bc0991bcc - মূলত ব্যবহার করে IsDefinedইনপুট মান চেক করতে, আপনি নিজেকে পরে নতুন enum মান যোগ মানুষ যা পাস হবে অরক্ষিত IsDefinedনতুন যেহেতু চেক ( মানটি নতুন কোডে বিদ্যমান) তবে এটি আপনার লেখা মূল কোডটির সাথে কাজ করবে না। সুতরাং আপনার কোডটি যে হ্যান্ডেল করতে সক্ষম তা এনামের মানগুলি স্পষ্টভাবে উল্লেখ করা আরও নিরাপদ।
অ্যাড্রিয়ান

237

বিকল্পভাবে, ওয়ান-লাইনারের পরিবর্তে একটি এক্সটেনশন পদ্ধতি ব্যবহার করুন:

public static T ToEnum<T>(this string enumString)
{
    return (T) Enum.Parse(typeof (T), enumString);
}

ব্যবহার:

Color colorEnum = "Red".ToEnum<Color>();

অথবা

string color = "Red";
var colorEnum = color.ToEnum<Color>();

7
ব্যবহারকারীর ইনপুট প্রক্রিয়াজাতকরণের জন্য, এনামের ওভারলোডটি কল করা সম্ভবত একটি ভাল ধারণা ars ।)
BrainSlugs83

9
হ্যান্ডি, তবে প্রশ্নটি বিশেষত ইনট সম্পর্কে জিজ্ঞাসা করে।
বিজেউরি

2
এটি স্ট্রিংটি পূর্ণসংখ্যা হিসাবে কাজ করে, যেমন "2"
19-19

2
এনামস্ট্রিং নাল হলে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে (গতকাল একই ধরণের সমস্যা ছিল)। পার্সের পরিবর্তে ট্রাইপার্স ব্যবহার বিবেচনা করুন। ট্রাইপার্সে টিও এনাম টাইপ কিনা তা যাচাই করবে
জাস্টিন

এ জাতীয় সম্প্রসারণের পদ্ধতিটি System.Stringমনে হচ্ছে নামস্থান দূষণের মতো মনে হচ্ছে
মিঃ অ্যান্ডারসন

159

আমি মনে করি একটি সম্পূর্ণ উত্তর পেতে, লোকেরা কীভাবে নেটগুলিতে অভ্যন্তরীণভাবে কাজ করে তা জানতে হবে।

স্টাফ কীভাবে কাজ করে

.NET এ এনাম হ'ল একটি কাঠামো যা মান (ক্ষেত্রগুলি) এর একটি সেটকে একটি মৌলিক ধরণের (ডিফল্ট হয় int) মানচিত্র দেয় । তবে আপনার এনাম যে মানচিত্রটিতে মানচিত্র তৈরি করেছেন তা আপনি বাস্তবে বেছে নিতে পারেন:

public enum Foo : short

এই ক্ষেত্রে এনামটি shortডেটা টাইপের সাথে ম্যাপ করা হয় , যার অর্থ এটি একটি সংক্ষিপ্ত হিসাবে মেমরিতে সংরক্ষণ করা হবে এবং আপনি যখন এটি andালাই এবং ব্যবহার করবেন তখন একটি সংক্ষিপ্ত হিসাবে আচরণ করবে।

যদি আপনি এটিকে আইএল দৃষ্টিকোণ থেকে দেখে থাকেন তবে একটি (সাধারণ, অন্তর্নিহিত) এনমটি দেখতে এই রকম হয়:

.class public auto ansi serializable sealed BarFlag extends System.Enum
{
    .custom instance void System.FlagsAttribute::.ctor()
    .custom instance void ComVisibleAttribute::.ctor(bool) = { bool(true) }

    .field public static literal valuetype BarFlag AllFlags = int32(0x3fff)
    .field public static literal valuetype BarFlag Foo1 = int32(1)
    .field public static literal valuetype BarFlag Foo2 = int32(0x2000)

    // and so on for all flags or enum values

    .field public specialname rtspecialname int32 value__
}

এখানে আপনার দৃষ্টি আকর্ষণ করা উচিত এটি value__হ'ল এনাম মানগুলি থেকে আলাদা। Fooউপরের value__এনামের ক্ষেত্রে , প্রকারটি 16 হয়। এটির মূলত অর্থ এই যে আপনি যতটা প্রকারের সাথে মেলে ততক্ষণ কোনও এনামে যা যা চান তা সঞ্চয় করতে পারেন ।

এই মুহুর্তে আমি এটি উল্লেখ করতে চাই যে System.Enumএটি একটি মান ধরণের, যা মূলত এর অর্থ BarFlagস্মৃতিতে 4 বাইট Fooনেবে এবং 2 নেবে - যেমন অন্তর্নিহিত ধরণের আকার (এটি আসলে এর চেয়ে জটিল আরও, তবে হেই ...)।

উত্তর

সুতরাং, আপনার যদি একটি পূর্ণসংখ্যা থাকে যা আপনি কোনও এনামকে মানচিত্র করতে চান, রানটাইমটিতে কেবল 2 টি কাজ করতে হবে: 4 বাইট অনুলিপি করুন এবং এটির অন্য কোনও নাম দিন (এনামের নাম)। অনুলিপি অন্তর্ভুক্ত কারণ ডেটা মান ধরণের হিসাবে সংরক্ষণ করা হয় - এর মূলত অর্থ এই যে আপনি যদি ব্যবস্থাবিহীন কোড ব্যবহার করেন তবে আপনি সহজেই ডেটা অনুলিপি করে এনাম এবং পূর্ণসংখ্যার বিনিময় করতে পারেন।

এটিকে সুরক্ষিত করার জন্য, আমি মনে করি যে অন্তর্নিহিত প্রকারগুলি একই বা অন্তর্নিহিত রূপান্তরযোগ্য এবং এনাম মান বিদ্যমান কিনা তা নিশ্চিত করার জন্য এটি সর্বোত্তম অনুশীলন (সেগুলি ডিফল্টরূপে পরীক্ষা করা হয় না!)।

এটি কীভাবে কাজ করে তা দেখতে নীচের কোডটি ব্যবহার করে দেখুন:

public enum MyEnum : int
{
    Foo = 1,
    Bar = 2,
    Mek = 5
}

static void Main(string[] args)
{
    var e1 = (MyEnum)5;
    var e2 = (MyEnum)6;

    Console.WriteLine("{0} {1}", e1, e2);
    Console.ReadLine();
}

নোট করুন যে কাস্টিংও e2কাজ করে! এই তোলে অর্থে উপরে কম্পাইলার দৃষ্টিকোণ থেকে: value__ক্ষেত্র কেবল পারেন 5 বা 6 এবং যখন দিয়ে পূর্ণ Console.WriteLineকল ToString(), নাম e1যখন নাম সমাধান করা e2নয়।

যদি আপনি যা চান Enum.IsDefined(typeof(MyEnum), 6)তা না হয় তবে আপনি কোনও মান নির্ধারিত এনামে কাস্ট করছেন তা পরীক্ষা করে দেখুন।

এছাড়াও নোট করুন যে আমি এনামের অন্তর্নিহিত ধরণের সম্পর্কে স্পষ্ট, যদিও সংকলক আসলে এটি পরীক্ষা করে। আমি যাতে রাস্তায় কোনও বিস্মিত না হয় তা নিশ্চিত করার জন্য আমি এটি করছি। ক্রিয়াকলাপে এই আশ্চর্যগুলি দেখতে, আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন (আসলে আমি এটি ডেটাবেস কোডে অনেক ঘটতে দেখেছি):

public enum MyEnum : short
{
    Mek = 5
}

static void Main(string[] args)
{
    var e1 = (MyEnum)32769; // will not compile, out of bounds for a short

    object o = 5;
    var e2 = (MyEnum)o;     // will throw at runtime, because o is of type int

    Console.WriteLine("{0} {1}", e1, e2);
    Console.ReadLine();
}

7
আমি বুঝতে পারি এটি একটি পুরানো পোস্ট, তবে আপনি কীভাবে সি # তে এই স্তরটির জ্ঞান অর্জন করবেন? এটি কি সি # স্পেসিফিকেশনের মাধ্যমে পড়া?
রোলান

20
@ রোলান আমি মাঝে মাঝে আরও বেশি মানুষ এটি জিজ্ঞাসা করতে চাই wish :-) সত্যি বলতে আমি আসলে জানি না; আমি কীভাবে জিনিসগুলি কাজ করে তা বোঝার চেষ্টা করি এবং যেখানেই পেতাম তথ্য পেতে পারি। আমি সি # স্ট্যান্ডার্ডটি পড়েছি, তবে আমি নিয়মিত রিফ্লেক্টরের সাথে কোডটি ডিসম্পাইলও করি (আমি এমনকি x86 এসেম্বলারের কোডটি অনেকটা দেখি) এবং প্রচুর অল্প পরীক্ষা করি। এছাড়াও, অন্যান্য ভাষা সম্পর্কে জ্ঞান এই ক্ষেত্রে সহায়তা করে; আমি এখন প্রায় 30 বছর ধরে সিএস করছি, এবং কিছু সময়ে কিছু জিনিস 'যৌক্তিক' হয়ে যায় - f.ex. একটি এনামের অবিচ্ছেদ্য ধরণের হওয়া উচিত, কারণ অন্যথায় ইন্টারপ ভেঙে যায় (বা আপনার পারফরম্যান্স ড্রেনে চলে যাবে)
আটলাস্ট

9
আমি বিশ্বাস করি সঠিকভাবে সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের মূল চাবিকাঠিটি কীভাবে কাজ করে তা জেনে রাখা। আমার জন্য এর অর্থ হ'ল আপনি যদি কোনও কোডের টুকরো লিখেন তবে আপনি জানেন যে এটি কীভাবে প্রায় f.ex. এ অনুবাদ করে to প্রসেসরের অপারেশন এবং মেমরি আনতে / লেখেন। আপনি যদি এই স্তরে কীভাবে পৌঁছতে চান তবে আমি কয়েক টন ছোট ছোট পরীক্ষার কেস তৈরির পরামর্শ দিচ্ছি, যাবার সাথে সাথে আরও শক্ত করে তুলছি, প্রতিবারের ফলাফলের পূর্বাভাস দেওয়ার চেষ্টা করুন এবং তারপরে পরীক্ষা করুন (ইনক্লু। ডিকম্পোলেশন ইত্যাদি)। সমস্ত বিবরণ এবং সমস্ত বৈশিষ্ট্যগুলি সনাক্ত করার পরে, আপনি (নিস্তেজ) স্ট্যান্ডার্ডটিতে এটি সঠিকভাবে পেয়েছেন কিনা তা পরীক্ষা করতে পারেন। কমপক্ষে, এটি আমার পদ্ধতির হবে।
আটলাস্ট

1
চমত্কার উত্তর, ধন্যবাদ! আপনার শেষ কোডের নমুনায় এটি রানটাইমে একটি ব্যতিক্রম ছুঁড়ে দেয় কারণ ও একটি বস্তু। সংক্ষিপ্ত পরিসরের মধ্যে পড়ার সাথে সাথে আপনি কোনও সংক্ষিপ্ত আকারে ভেরিয়েবল কাস্ট করতে পারেন।
gravidThoughts

ধন্যবাদ প্রকৃতপক্ষে এটি একটি আনবক্সিং অপারেশন, সুতরাং এটি আপনার বর্ণনার মতো কোনও অন্তর্নিহিত রূপান্তরগুলি করবে না। Youালাই কখনও কখনও সি # তে বিভ্রান্ত হয় আপনি যদি বিশদটি জানেন না ... তবে যাইহোক, কারণ int= = shortএটি নিক্ষেপ করবে (আনবক্সিং ব্যর্থ হবে)। আপনি যদি object o = (short)5;এটি করেন তবে এটি কাজ করবে, কারণ তবে প্রকারগুলি মিলবে। এটি পরিসীমা সম্পর্কে নয়, এটি আসলে ধরণের সম্পর্কে।
আটলাস্ট

120

নিম্নলিখিত উদাহরণটি ধরুন:

int one = 1;
MyEnum e = (MyEnum)one;

63

আমি আমার এনামটিতে কাস্ট করতে এই টুকরো কোডটি ব্যবহার করছি:

if (typeof(YourEnum).IsEnumDefined(valueToCast)) return (YourEnum)valueToCast;
else { //handle it here, if its not defined }

আমি এটি সেরা সমাধান খুঁজে।


1
এটা ভাল. আমি অবাক হয়েছি যখন কোনও ইনট-ব্যাকড এনামে কোনও অবৈধ মান ingালাইয়ের সময় ব্যতিক্রম হয়নি।
ওরিওন এলিজিল

এটি আসলে শীর্ষ রেট করা উত্তরের চেয়ে আলাদা নয়। আপনি উত্তরটি এনুম টাইপটিতে স্ট্রিংটি কাস্ট করার পরে সেই উত্তরটি এনাম.আইএসডিফাইন্ডড ব্যবহার করেও আলোচনা করে। সুতরাং এমনকি যদি স্ট্রিংটি ত্রুটি ছাড়াই কাস্ট করা থাকে তবে এনাম.আইএসডিফাইন্ড এখনও তা ধরতে পারে
ডন

52

নীচে এনুমসের জন্য একটি দুর্দান্ত ইউটিলিটি শ্রেণি রয়েছে

public static class EnumHelper
{
    public static int[] ToIntArray<T>(T[] value)
    {
        int[] result = new int[value.Length];
        for (int i = 0; i < value.Length; i++)
            result[i] = Convert.ToInt32(value[i]);
        return result;
    }

    public static T[] FromIntArray<T>(int[] value) 
    {
        T[] result = new T[value.Length];
        for (int i = 0; i < value.Length; i++)
            result[i] = (T)Enum.ToObject(typeof(T),value[i]);
        return result;
    }


    internal static T Parse<T>(string value, T defaultValue)
    {
        if (Enum.IsDefined(typeof(T), value))
            return (T) Enum.Parse(typeof (T), value);

        int num;
        if(int.TryParse(value,out num))
        {
            if (Enum.IsDefined(typeof(T), num))
                return (T)Enum.ToObject(typeof(T), num);
        }

        return defaultValue;
    }
}

46

সংখ্যাসূচক মানের জন্য, এটি নিরাপদ কারণ এটি কোনও বস্তুকেই ফেরত দেবে:

public static class EnumEx
{
    static public bool TryConvert<T>(int value, out T result)
    {
        result = default(T);
        bool success = Enum.IsDefined(typeof(T), value);
        if (success)
        {
            result = (T)Enum.ToObject(typeof(T), value);
        }
        return success;
    }
}

ফ্ল্যাগ এনামের জন্য কাজ করে না
সাইয়েড মুর্তেজা মৌসভী

44

আপনি যদি 4.0। নেট ফ্রেমওয়ার্কের জন্য প্রস্তুত থাকেন তবে একটি নতুন এনাম.ট্রি পার্স () ফাংশন রয়েছে যা খুব দরকারী এবং [পতাকা] বৈশিষ্ট্যের সাথে ভাল খেলায়Enum.TryParse পদ্ধতি দেখুন (স্ট্রিং, TEnum%)


21
স্ট্রিং থেকে রূপান্তর করার সময় এটি দরকারী। কিন্তু কোন int থেকে রূপান্তর করার সময় নয়।
কোডসইনচাউস

35

আপনার যদি একটি পূর্ণসংখ্যা থাকে যা বিটমাস্ক হিসাবে কাজ করে এবং [পতাকা] গণনায় এক বা একাধিক মানের প্রতিনিধিত্ব করতে পারে, আপনি পৃথক পতাকাঙ্কের মানগুলি তালিকায় পার্স করার জন্য এই কোডটি ব্যবহার করতে পারেন:

for (var flagIterator = 0; flagIterator < 32; flagIterator++)
{
    // Determine the bit value (1,2,4,...,Int32.MinValue)
    int bitValue = 1 << flagIterator;

    // Check to see if the current flag exists in the bit mask
    if ((intValue & bitValue) != 0)
    {
        // If the current flag exists in the enumeration, then we can add that value to the list
        // if the enumeration has that flag defined
        if (Enum.IsDefined(typeof(MyEnum), bitValue))
            Console.WriteLine((MyEnum)bitValue);
    }
}

নোট করুন যে এটি অনুমান করে যে এর অন্তর্নিহিত ধরণটি enumএকটি স্বাক্ষরিত 32-বিট পূর্ণসংখ্যা। যদি এটি ভিন্ন একটি সংখ্যাসূচক ধরণের হয় তবে আপনাকে সেই ধরণের বিটগুলি প্রতিবিম্বিত করতে হার্ডকডযুক্ত 32 পরিবর্তন করতে হবে (বা এটি ব্যবহার করে প্রগতিগতভাবে উত্পন্ন করতে হবে Enum.GetUnderlyingType())


1
এই লুপটি কখনই শেষ হয় না? ফ্ল্যাগআইট্রেটর = 0x00000001, ফ্ল্যাগইট্রেটার = 0x00000002, ফ্ল্যাগইট্রেটার = 0x00000004, ..., ফ্ল্যাগইট্রেটার = 0x40000000, ফ্ল্যাগইট্রেটার = 0x80000000, ফ্ল্যাগআইট্রেটর = 0x00000000। অন্য কথায়, মানটি সর্বদা 0x80000000 এর চেয়ে কম থাকবে কারণ বিট ডি 31 = 1 এর পরে এটি শূন্যের দিকে প্রবাহিত হবে তারপরে, এটি চিরতরে থেকে যায় কারণ 0 থেকে বামে স্থানান্তর 0 দেয় 0 দেয়
ক্রিশ্চান গিংগ্রাস

দুর্দান্ত ক্রিশ্চিয়াটিঙ্গিংরাস, আপনাকে ধন্যবাদ! আমি তার জন্য অ্যাকাউন্টে উত্তরটি পরিবর্তন করেছি এবং যখন সর্বোচ্চ বিট সেট করা হয় তখন এটি অ্যাকাউন্টে নেওয়া উচিত (যেমন 0x80000000 / Int32.MinValue)
ইভান এম

27

কখনও কখনও আপনি MyEnumটাইপ একটি বিষয় আছে । মত

var MyEnumType = typeof(MyEnumType);

তারপর:

Enum.ToObject(typeof(MyEnum), 3)

26

এটি একটি পতাকা গণনা সচেতন নিরাপদ রূপান্তর পদ্ধতি:

public static bool TryConvertToEnum<T>(this int instance, out T result)
  where T: Enum
{
  var enumType = typeof (T);
  var success = Enum.IsDefined(enumType, instance);
  if (success)
  {
    result = (T)Enum.ToObject(enumType, instance);
  }
  else
  {
    result = default(T);
  }
  return success;
}

3
এটি Enumপরিবর্তে সীমাবদ্ধ করে এখন সি # 7.3 দিয়ে উন্নত করা যেতে পারে structযার অর্থ আমাদের রানটাইম চেকের উপর নির্ভর করতে হবে না!
স্কট

20

এখানে চিত্র বর্ণনা লিখুন

স্ট্রিংটিকে ENUM এ রূপান্তর করতে বা int থেকে ENUM ধ্রুবককে এনুম.পার্স ফাংশন ব্যবহার করতে হবে। এখানে একটি ইউটিউব ভিডিও https://www.youtube.com/watch?v=4nhx4VwdRDk যা প্রকৃতপক্ষে স্ট্রিং সহ প্রদর্শিত হয় এবং এটি একই জন্য প্রযোজ্য।

কোডটি নীচে দেখানো হয়েছে যেখানে "লাল" স্ট্রিং এবং "মাইগ্র্যান্ড" রঙের ENUM যা রঙের ধ্রুবক রয়েছে।

MyColors EnumColors = (MyColors)Enum.Parse(typeof(MyColors), "Red");

20

আসল প্রশ্ন থেকে কিছুটা দূরে সরে যাচ্ছি, কিন্তু আমি স্ট্যাক ওভারফ্লো প্রশ্নের উত্তর পেয়েছি এনাম দরকারী থেকে ইনট মান পেতেpublic const intবৈশিষ্ট্যগুলি সহ একটি স্ট্যাটিক ক্লাস তৈরি করুন , যাতে সহজেই সম্পর্কিত intধ্রুবকগুলির একগুচ্ছ একসাথে সংগ্রহ করতে পারবেন এবং সেগুলি intব্যবহার করার সময় সেগুলিতে নিক্ষেপ করতে হবে না।

public static class Question
{
    public static readonly int Role = 2;
    public static readonly int ProjectFunding = 3;
    public static readonly int TotalEmployee = 4;
    public static readonly int NumberOfServers = 5;
    public static readonly int TopBusinessConcern = 6;
}

স্পষ্টতই, এনাম টাইপের কিছু কার্যকারিতা হারিয়ে যাবে, তবে একগুচ্ছ ডাটাবেস আইডি ধ্রুবক সংরক্ষণ করার জন্য, এটি বেশ পরিপাটি সমাধানের মতো বলে মনে হচ্ছে।


5
এনামগুলি আরও ধরণের সুরক্ষা সরবরাহ করার কারণে এ জাতীয় পূর্ণসংখ্যার ধ্রুবকগুলির ব্যবহারকে ছাড়িয়ে যায়
পল রিচার্ডস

1
পল, এটি সম্পর্কিত ইন্টেস্ট্যান্টগুলি (যেমন ডেটাবেস আইডি কনস্ট্যান্টস) একসাথে সংগ্রহ করার একটি পদ্ধতি যাতে তারা প্রতিবার ব্যবহার করা হয় তাদের বিন্যাসে না ফেলেই সরাসরি ব্যবহার করা যায়। তাদের টাইপ হয় পূর্ণসংখ্যা, উদাহরণস্বরূপ না, DatabaseIdsEnum।
টেড

1
কমপক্ষে একটি পরিস্থিতি রয়েছে যা আমি পেয়েছি যে এনাম টাইপ সুরক্ষাটি অজান্তেই বাইপাস করা যায়।
থিয়েরি

তবে এনামগুলিও নিশ্চিত করে যে মানগুলি সমস্ত অনন্য, এই
পদ্ধতিরও

15

এটি উপরের তাওয়ানির ইউটিলিটি ক্লাসের মতো জেনেরিকগুলি ব্যবহার করে ডট.নেট 4.0 এ আংশিক মিলের সাথে একটি লক্ষ্য এনামের সাথে পূর্ণসংখ্যা বা স্ট্রিংগুলি পার্স করে। আমি এটি কমান্ড-লাইনের সুইচ ভেরিয়েবলগুলিতে রূপান্তর করতে ব্যবহার করছি যা অসম্পূর্ণ হতে পারে। যেহেতু একটি এনাম নাল হতে পারে না, আপনার যুক্তিযুক্তভাবে একটি ডিফল্ট মান প্রদান করা উচিত। এটিকে এভাবে বলা যেতে পারে:

var result = EnumParser<MyEnum>.Parse(valueToParse, MyEnum.FirstValue);

কোডটি এখানে:

using System;

public class EnumParser<T> where T : struct
{
    public static T Parse(int toParse, T defaultVal)
    {
        return Parse(toParse + "", defaultVal);
    }
    public static T Parse(string toParse, T defaultVal) 
    {
        T enumVal = defaultVal;
        if (defaultVal is Enum && !String.IsNullOrEmpty(toParse))
        {
            int index;
            if (int.TryParse(toParse, out index))
            {
                Enum.TryParse(index + "", out enumVal);
            }
            else
            {
                if (!Enum.TryParse<T>(toParse + "", true, out enumVal))
                {
                    MatchPartialName(toParse, ref enumVal);
                }
            }
        }
        return enumVal;
    }

    public static void MatchPartialName(string toParse, ref T enumVal)
    {
        foreach (string member in enumVal.GetType().GetEnumNames())
        {
            if (member.ToLower().Contains(toParse.ToLower()))
            {
                if (Enum.TryParse<T>(member + "", out enumVal))
                {
                    break;
                }
            }
        }
    }
}

এফওয়াইআই: প্রশ্নটি পূর্ণসংখ্যা সম্পর্কিত ছিল, যার উল্লেখ নেই কেউ এনামেও স্পষ্টভাবে রূপান্তর করবে ry ট্রাইপার্স ()


13

একটি স্ট্রিং থেকে: (Enum.Parse এর মেয়াদ শেষ হয়ে গেছে, Enum.TryParse ব্যবহার করুন)

enum Importance
{}

Importance importance;

if (Enum.TryParse(value, out importance))
{
}

4
প্রশ্নটি বিশেষত পূর্ণসংখ্যা সম্পর্কে জিজ্ঞাসা করে।
বিজেউরি

4
উইল ইউ ক্লিক করুন আপনার উত্তর সকলকে জানতে Enum.TryParse মান বা enum নামের একটি স্ট্রিং কাজ করবে (আমি প্রতিহত করতে পারে না) যাক
JeremyWeir

1
জেরেমি, ওয়েয়ার এতে কাজ করছেন (কোনওভাবেই প্রতিহত করতে পারেননি)।
হাইস্টেনট্রু

11

নিম্নলিখিতটি কিছুটা ভাল এক্সটেনশন পদ্ধতি

public static string ToEnumString<TEnum>(this int enumValue)
        {
            var enumString = enumValue.ToString();
            if (Enum.IsDefined(typeof(TEnum), enumValue))
            {
                enumString = ((TEnum) Enum.ToObject(typeof (TEnum), enumValue)).ToString();
            }
            return enumString;
        }

10

আমার ক্ষেত্রে, আমাকে ডাব্লুসিএফ পরিষেবা থেকে এনামটি ফিরিয়ে নেওয়া দরকার। আমারও একটি বন্ধুত্বপূর্ণ নাম প্রয়োজন, কেবল এনাম না o টুস্ট্রিং ()।

এখানে আমার ডাব্লুসিএফ ক্লাস।

[DataContract]
public class EnumMember
{
    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public int Value { get; set; }

    public static List<EnumMember> ConvertToList<T>()
    {
        Type type = typeof(T);

        if (!type.IsEnum)
        {
            throw new ArgumentException("T must be of type enumeration.");
        }

        var members = new List<EnumMember>();

        foreach (string item in System.Enum.GetNames(type))
        {
            var enumType = System.Enum.Parse(type, item);

            members.Add(
                new EnumMember() { Description = enumType.GetDescriptionValue(), Value = ((IConvertible)enumType).ToInt32(null) });
        }

        return members;
    }
}

এনাম থেকে বিবরণটি পাবেন এমন এক্সটেনশন পদ্ধতি এখানে।

    public static string GetDescriptionValue<T>(this T source)
    {
        FieldInfo fileInfo = source.GetType().GetField(source.ToString());
        DescriptionAttribute[] attributes = (DescriptionAttribute[])fileInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);            

        if (attributes != null && attributes.Length > 0)
        {
            return attributes[0].Description;
        }
        else
        {
            return source.ToString();
        }
    }

বাস্তবায়ন:

return EnumMember.ConvertToList<YourType>();

9

এই এনাম এক্সটেনশনের অংশটি আমি কোথায় পেয়েছি তা আমি আর জানি না, তবে এটি স্ট্যাকওভারফ্লো থেকে। আমি এই জন্য দুঃখিত! তবে আমি এটি নিয়েছি এবং এটি পতাকা সহ এনামগুলির জন্য সংশোধন করেছি। পতাকা সহ এনামগুলির জন্য আমি এটি করেছি:

  public static class Enum<T> where T : struct
  {
     private static readonly IEnumerable<T> All = Enum.GetValues(typeof (T)).Cast<T>();
     private static readonly Dictionary<int, T> Values = All.ToDictionary(k => Convert.ToInt32(k));

     public static T? CastOrNull(int value)
     {
        T foundValue;
        if (Values.TryGetValue(value, out foundValue))
        {
           return foundValue;
        }

        // For enums with Flags-Attribut.
        try
        {
           bool isFlag = typeof(T).GetCustomAttributes(typeof(FlagsAttribute), false).Length > 0;
           if (isFlag)
           {
              int existingIntValue = 0;

              foreach (T t in Enum.GetValues(typeof(T)))
              {
                 if ((value & Convert.ToInt32(t)) > 0)
                 {
                    existingIntValue |= Convert.ToInt32(t);
                 }
              }
              if (existingIntValue == 0)
              {
                 return null;
              }

              return (T)(Enum.Parse(typeof(T), existingIntValue.ToString(), true));
           }
        }
        catch (Exception)
        {
           return null;
        }
        return null;
     }
  }

উদাহরণ:

[Flags]
public enum PetType
{
  None = 0, Dog = 1, Cat = 2, Fish = 4, Bird = 8, Reptile = 16, Other = 32
};

integer values 
1=Dog;
13= Dog | Fish | Bird;
96= Other;
128= Null;

9

আরও শক্তিশালী হওয়ার জন্য আপনার কোনও প্রকারের সাথে মিলে যাওয়া শিথিলতা তৈরি করা উচিত।

public static T ToEnum<T>(dynamic value)
{
    if (value == null)
    {
        // default value of an enum is the object that corresponds to
        // the default value of its underlying type
        // https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/default-values-table
        value = Activator.CreateInstance(Enum.GetUnderlyingType(typeof(T)));
    }
    else if (value is string name)
    {
        return (T)Enum.Parse(typeof(T), name);
    }

    return (T)Enum.ToObject(typeof(T),
             Convert.ChangeType(value, Enum.GetUnderlyingType(typeof(T))));
}

পরীক্ষা ক্ষেত্রে

[Flags]
public enum A : uint
{
    None  = 0, 
    X     = 1 < 0,
    Y     = 1 < 1
}

static void Main(string[] args)
{
    var value = EnumHelper.ToEnum<A>(7m);
    var x = value.HasFlag(A.X); // true
    var y = value.HasFlag(A.Y); // true

    var value2 = EnumHelper.ToEnum<A>("X");

    var value3 = EnumHelper.ToEnum<A>(null);

    Console.ReadKey();
}

এটি একটি দুর্দান্ত উত্তর। এই মুহুর্তে এটি এখন পৃষ্ঠার নিচে লজ্জাজনক!
মাইকবিটেন

8

কাস্ট করার বিভিন্ন উপায় এবং থেকে Enum

enum orientation : byte
{
 north = 1,
 south = 2,
 east = 3,
 west = 4
}

class Program
{
  static void Main(string[] args)
  {
    orientation myDirection = orientation.north;
    Console.WriteLine(“myDirection = {0}”, myDirection); //output myDirection =north
    Console.WriteLine((byte)myDirection); //output 1

    string strDir = Convert.ToString(myDirection);
        Console.WriteLine(strDir); //output north

    string myString = north”; //to convert string to Enum
    myDirection = (orientation)Enum.Parse(typeof(orientation),myString);


 }
}

8

এটি আপনাকে যে কোনও ইনপুট ডেটা ব্যবহারকারীর পছন্দসই এনামে রূপান্তর করতে সহায়তা করতে পারে । ধরুন আপনার নীচের মতো একটি এনাম রয়েছে যার দ্বারা ডিফল্ট ইনট । আপনার এনামের প্রথমটিতে একটি ডিফল্ট মান যুক্ত করুন । যা ইনপুট মানের সাথে কোনও মিল খুঁজে পাওয়া যায় নি যখন সাহায্যকারীদের মধ্যস্থতাকারীতে ব্যবহৃত হয়।

public enum FriendType  
{
    Default,
    Audio,
    Video,
    Image
}

public static class EnumHelper<T>
{
    public static T ConvertToEnum(dynamic value)
    {
        var result = default(T);
        var tempType = 0;

        //see Note below
        if (value != null &&
            int.TryParse(value.ToString(), out  tempType) && 
            Enum.IsDefined(typeof(T), tempType))
        {
            result = (T)Enum.ToObject(typeof(T), tempType); 
        }
        return result;
    }
}

এনবি: এখানে আমি মানকে ইন্টের মধ্যে পার্স করার চেষ্টা করব, কারণ এনাম ডিফল্ট ইনট হয় আপনি যদি এনামকে এই জাতীয় সংজ্ঞা দেন যা বাইট টাইপ।

public enum MediaType : byte
{
    Default,
    Audio,
    Video,
    Image
} 

আপনাকে এ থেকে সহায়ক পদ্ধতিতে পার্সিং পরিবর্তন করতে হবে

int.TryParse(value.ToString(), out  tempType)

প্রতি

byte.TryParse(value.ToString(), out tempType)

ইনপুটগুলি অনুসরণ করার জন্য আমি আমার পদ্ধতিটি পরীক্ষা করি

EnumHelper<FriendType>.ConvertToEnum(null);
EnumHelper<FriendType>.ConvertToEnum("");
EnumHelper<FriendType>.ConvertToEnum("-1");
EnumHelper<FriendType>.ConvertToEnum("6");
EnumHelper<FriendType>.ConvertToEnum("");
EnumHelper<FriendType>.ConvertToEnum("2");
EnumHelper<FriendType>.ConvertToEnum(-1);
EnumHelper<FriendType>.ConvertToEnum(0);
EnumHelper<FriendType>.ConvertToEnum(1);
EnumHelper<FriendType>.ConvertToEnum(9);

আমার ইংরেজীর জন্য দুঃখিত


8

এখানে একটি এক্সটেনশন পদ্ধতি যা কাস্ট Int32করে Enum

এটি সর্বাধিক সম্ভাব্য মানের চেয়ে বেশি হলেও এমনকি বিটওয়াইজ ফ্ল্যাগগুলিকে সম্মান করে। উদাহরণস্বরূপ, যদি আপনার সম্ভাবনা 1 , 2 , এবং 4 এর সাথে এনাম থাকে তবে ইনট 9 হয় তবে এটি 8 এর অনুপস্থিতিতে 1 হিসাবে বুঝতে পারে । এটি আপনাকে কোড আপডেটের আগে ডেটা আপডেট করতে দেয়।

   public static TEnum ToEnum<TEnum>(this int val) where TEnum : struct, IComparable, IFormattable, IConvertible
    {
        if (!typeof(TEnum).IsEnum)
        {
            return default(TEnum);
        }

        if (Enum.IsDefined(typeof(TEnum), val))
        {//if a straightforward single value, return that
            return (TEnum)Enum.ToObject(typeof(TEnum), val);
        }

        var candidates = Enum
            .GetValues(typeof(TEnum))
            .Cast<int>()
            .ToList();

        var isBitwise = candidates
            .Select((n, i) => {
                if (i < 2) return n == 0 || n == 1;
                return n / 2 == candidates[i - 1];
            })
            .All(y => y);

        var maxPossible = candidates.Sum();

        if (
            Enum.TryParse(val.ToString(), out TEnum asEnum)
            && (val <= maxPossible || !isBitwise)
        ){//if it can be parsed as a bitwise enum with multiple flags,
          //or is not bitwise, return the result of TryParse
            return asEnum;
        }

        //If the value is higher than all possible combinations,
        //remove the high imaginary values not accounted for in the enum
        var excess = Enumerable
            .Range(0, 32)
            .Select(n => (int)Math.Pow(2, n))
            .Where(n => n <= val && n > 0 && !candidates.Contains(n))
            .Sum();

        return Enum.TryParse((val - excess).ToString(), out asEnum) ? asEnum : default(TEnum);
    }

6

সি # তে প্রবেশ করার জন্য কোনও ইন্টি কাস্ট করার সহজ এবং স্পষ্ট উপায়:

 public class Program
    {
        public enum Color : int
        {
            Blue = 0,
            Black = 1,
            Green = 2,
            Gray = 3,
            Yellow =4
        }

        public static void Main(string[] args)
        {
            //from string
            Console.WriteLine((Color) Enum.Parse(typeof(Color), "Green"));

            //from int
            Console.WriteLine((Color)2);

            //From number you can also
            Console.WriteLine((Color)Enum.ToObject(typeof(Color) ,2));
        }
    }

6

আপনি কেবল এনাম বা ইনম ইন ইনামের জন্য স্পষ্ট রূপান্তর কাস্ট ইন্ট ব্যবহার করেন

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine((int)Number.three); //Output=3

        Console.WriteLine((Number)3);// Outout three
        Console.Read();
    }

    public enum Number
    {
        Zero = 0,
        One = 1,
        Two = 2,
        three = 3
    }
}

4
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace SamplePrograme
{
    public class Program
    {
        public enum Suit : int
        {
            Spades = 0,
            Hearts = 1,
            Clubs = 2,
            Diamonds = 3
        }

        public static void Main(string[] args)
        {
            //from string
            Console.WriteLine((Suit) Enum.Parse(typeof(Suit), "Clubs"));

            //from int
            Console.WriteLine((Suit)1);

            //From number you can also
            Console.WriteLine((Suit)Enum.ToObject(typeof(Suit) ,1));
        }
    }
}

3

আপনি ঠিক নীচের মত করুন:

int intToCast = 1;
TargetEnum f = (TargetEnum) intToCast ;

আপনি কেবল সঠিক মানগুলি দিয়েছেন এবং আপনি অন্যথায় ব্যতিক্রম করতে পারেন তা নিশ্চিত করার জন্য:

int intToCast = 1;
if (Enum.IsDefined(typeof(TargetEnum), intToCast ))
{
    TargetEnum target = (TargetEnum)intToCast ;
}
else
{
   // Throw your exception.
}

নোট করুন যে আইসডিফাইন্ড ব্যবহার করা ব্যয়বহুল এবং কেবল ingালাইয়ের চেয়েও বেশি, সুতরাং এটি ব্যবহার করার সিদ্ধান্ত নেওয়ার সিদ্ধান্ত গ্রহণ করা আপনার বাস্তবায়নের উপর নির্ভর করে।


3

আপনি এক্সটেনশন পদ্ধতি ব্যবহার করতে পারেন।

public static class Extensions
{

    public static T ToEnum<T>(this string data) where T : struct
    {
        if (!Enum.TryParse(data, true, out T enumVariable))
        {
            if (Enum.IsDefined(typeof(T), enumVariable))
            {
                return enumVariable;
            }
        }

        return default;
    }

    public static T ToEnum<T>(this int data) where T : struct
    {
        return (T)Enum.ToObject(typeof(T), data);
    }
}

বেলো কোডের মতো ব্যবহার করুন

এনাম:

public enum DaysOfWeeks
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
    Sunday = 7,
}

ব্যবহার:

 string Monday = "Mon";
 int Wednesday = 3;
 var Mon = Monday.ToEnum<DaysOfWeeks>();
 var Wed = Wednesday.ToEnum<DaysOfWeeks>();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.