c# - একটি Enum স্ট্রিং উপস্থাপনা




enums (20)

আপনাদের মধ্যে অনেকে , আমি জ্যাকব Šturc দ্বারা নির্বাচিত উত্তর পছন্দ করি, কিন্তু আমি কপি-পেস্ট কোডটি সত্যিই ঘৃণা করি এবং যতটা সম্ভব তা করতে চেষ্টা করি।

তাই আমি সিদ্ধান্ত নিলাম যে আমি একটি এনমবেস ক্লাস চেয়েছি যা থেকে সর্বাধিক কার্যকারিতা উত্তরাধিকারসূত্রে / অন্তর্নির্মিত, যা আমাকে আচরণের পরিবর্তে সামগ্রীতে ফোকাস করতে দেয়।

এই পদ্ধতির মূল সমস্যাটি এই সত্যের উপর ভিত্তি করে তৈরি করা হয়েছে যে যদিও এনাম মূল্যগুলি টাইপ-নিরাপদ দৃষ্টান্ত তবে আন্তঃসংযোগ Enum ক্লাসের স্ট্যাটিক বাস্তবায়নের সাথে জড়িত। তাই জেনেরিক্স ম্যাজিকের একটু সাহায্য নিয়ে, আমি অবশেষে সঠিক মিশ্রণ পেয়েছিলাম। আশা করি কেউ এই হিসাবে দরকারী হিসাবে কাজ করে।

আমি Jakub এর উদাহরণ দিয়ে শুরু করব, কিন্তু উত্তরাধিকার এবং জেনেরিক্স ব্যবহার করে:

public sealed class AuthenticationMethod : EnumBase<AuthenticationMethod, int>
{
    public static readonly AuthenticationMethod FORMS =
        new AuthenticationMethod(1, "FORMS");
    public static readonly AuthenticationMethod WINDOWSAUTHENTICATION =
        new AuthenticationMethod(2, "WINDOWS");
    public static readonly AuthenticationMethod SINGLESIGNON =
        new AuthenticationMethod(3, "SSN");

    private AuthenticationMethod(int Value, String Name)
        : base( Value, Name ) { }
    public new static IEnumerable<AuthenticationMethod> All
    { get { return EnumBase<AuthenticationMethod, int>.All; } }
    public static explicit operator AuthenticationMethod(string str)
    { return Parse(str); }
}

এবং এখানে বেস বর্গ:

using System;
using System.Collections.Generic;
using System.Linq; // for the .AsEnumerable() method call

// E is the derived type-safe-enum class
// - this allows all static members to be truly unique to the specific
//   derived class
public class EnumBase<E, T> where E: EnumBase<E, T>
{
    #region Instance code
    public T Value { get; private set; }
    public string Name { get; private set; }

    protected EnumBase(T EnumValue, string Name)
    {
        Value = EnumValue;
        this.Name = Name;
        mapping.Add(Name, this);
    }

    public override string ToString() { return Name; }
    #endregion

    #region Static tools
    static private readonly Dictionary<string, EnumBase<E, T>> mapping;
    static EnumBase() { mapping = new Dictionary<string, EnumBase<E, T>>(); }
    protected static E Parse(string name)
    {
        EnumBase<E, T> result;
        if (mapping.TryGetValue(name, out result))
        {
            return (E)result;
        }

        throw new InvalidCastException();
    }
    // This is protected to force the child class to expose it's own static
    // method.
    // By recreating this static method at the derived class, static
    // initialization will be explicit, promising the mapping dictionary
    // will never be empty when this method is called.
    protected static IEnumerable<E> All
    { get { return mapping.Values.AsEnumerable().Cast<E>(); } }
    #endregion
}

আমার নিম্নলিখিত পরিমাপ আছে:

public enum AuthenticationMethod
{
    FORMS = 1,
    WINDOWSAUTHENTICATION = 2,
    SINGLESIGNON = 3
}

সমস্যাটি হচ্ছে আমি যখন "AuthenticationMethod.FORMS" এর জন্য জিজ্ঞাসা করি এবং আইডি 1 নম্বরে "FORMS" শব্দটির প্রয়োজন হয়।

আমি এই সমস্যার জন্য নিম্নলিখিত সমাধান খুঁজে পেয়েছি ( link ):

প্রথমে আমি "স্ট্রিং ভ্যালু" নামে একটি কাস্টম বৈশিষ্ট্য তৈরি করতে হবে:

public class StringValue : System.Attribute
{
    private readonly string _value;

    public StringValue(string value)
    {
        _value = value;
    }

    public string Value
    {
        get { return _value; }
    }

}

তারপর আমি আমার সংখ্যার এই বৈশিষ্ট্য যোগ করতে পারেন:

public enum AuthenticationMethod
{
    [StringValue("FORMS")]
    FORMS = 1,
    [StringValue("WINDOWS")]
    WINDOWSAUTHENTICATION = 2,
    [StringValue("SSO")]
    SINGLESIGNON = 3
}

এবং অবশ্যই আমি StringValue পুনরুদ্ধার করতে কিছু চাই:

public static class StringEnum
{
    public static string GetStringValue(Enum value)
    {
        string output = null;
        Type type = value.GetType();

        //Check first in our cached results...

        //Look for our 'StringValueAttribute' 

        //in the field's custom attributes

        FieldInfo fi = type.GetField(value.ToString());
        StringValue[] attrs =
           fi.GetCustomAttributes(typeof(StringValue),
                                   false) as StringValue[];
        if (attrs.Length > 0)
        {
            output = attrs[0].Value;
        }

        return output;
    }
}

ভাল এখন আমি একটি সংখ্যার জন্য একটি স্ট্রিং মান পেতে সরঞ্জাম আছে। আমি তারপর এটি ব্যবহার করতে পারেন:

string valueOfAuthenticationMethod = StringEnum.GetStringValue(AuthenticationMethod.FORMS);

ঠিক আছে এখন এই কাজ সব একটি কবজ মত কিন্তু আমি এটি একটি সম্পূর্ণ অনেক কাজ খুঁজে। আমি এই জন্য একটি ভাল সমাধান যদি বিস্ময়ের ছিল।

আমি অভিধান এবং স্ট্যাটিক বৈশিষ্ট্যের সাথে কিছু করার চেষ্টা করেছি কিন্তু এটি ভাল ছিল না।


আপনার প্রশ্নের মধ্যে আপনি কখনও বলেন যে আপনি আসলে enum এর সাংখ্যিক মান প্রয়োজন কোথাও।

যদি আপনি না করেন এবং টাইমের স্ট্রিংয়ের একটি enum প্রয়োজন হয় (যা একটি অবিচ্ছেদ্য ধরনের নয় তাই এটি enum একটি বেস হতে পারে না) এখানে একটি উপায়:

    static class AuthenticationMethod
    {
        public static readonly string
            FORMS = "Forms",
            WINDOWSAUTHENTICATION = "WindowsAuthentication";
    }

আপনি এটি রেফারেন্স করতে enum হিসাবে একই সিনট্যাক্স ব্যবহার করতে পারেন

if (bla == AuthenticationMethod.FORMS)

সংখ্যাসূচক মানগুলির তুলনায় এটি একটু ধীর হবে (সংখ্যার পরিবর্তে স্ট্রিংগুলি তুলনা করে) তবে প্লাস পাশে এটি স্ট্রিং অ্যাক্সেস করার জন্য প্রতিফলন (ধীর) ব্যবহার করে না।


আমি System.ComponentModel নামস্থান থেকে বর্ণনা বৈশিষ্ট্য ব্যবহার করি। শুধু enum সাজাইয়া এবং তারপর এটি উদ্ধার করার জন্য এই কোড ব্যবহার করুন:

public static string GetDescription<T>(this object enumerationValue)
            where T : struct
        {
            Type type = enumerationValue.GetType();
            if (!type.IsEnum)
            {
                throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue");
            }

            //Tries to find a DescriptionAttribute for a potential friendly name
            //for the enum
            MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString());
            if (memberInfo != null && memberInfo.Length > 0)
            {
                object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

                if (attrs != null && attrs.Length > 0)
                {
                    //Pull out the description value
                    return ((DescriptionAttribute)attrs[0]).Description;
                }
            }
            //If we have no description attribute, just return the ToString of the enum
            return enumerationValue.ToString();

        }

একটি উদাহরণ হিসাবে:

public enum Cycle : int
{        
   [Description("Daily Cycle")]
   Daily = 1,
   Weekly,
   Monthly
}

এই কোডটি চমৎকারভাবে enums এর জন্য সরবরাহ করে যেখানে আপনাকে একটি "বন্ধুত্বপূর্ণ নাম" দরকার না এবং শুধুমাত্র enum এর .TString () টি ফেরত দেবে।


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

public static class AttributesHelperExtension
    {
        public static string ToDescription(this Enum value)
        {
            var da = (DescriptionAttribute[])(value.GetType().GetField(value.ToString())).GetCustomAttributes(typeof(DescriptionAttribute), false);
            return da.Length > 0 ? da[0].Description : value.ToString();
        }
}

এখন enum সাজাইয়া সঙ্গে:

public enum AuthenticationMethod
{
    [Description("FORMS")]
    FORMS = 1,
    [Description("WINDOWSAUTHENTICATION")]
    WINDOWSAUTHENTICATION = 2,
    [Description("SINGLESIGNON ")]
    SINGLESIGNON = 3
}

যখন আপনি কল

AuthenticationMethod.FORMS.ToDescription() আপনি "FORMS"


আমি জ্যাকব Šturc এর উত্তরটি সত্যিই পছন্দ করি, কিন্তু এটি হতাশাজনক যে আপনি এটি একটি সুইচ-কেস বিবৃতির সাথে ব্যবহার করতে পারবেন না। এখানে তার উত্তরের একটি সামান্য সংশোধিত সংস্করণ যা একটি সুইচ বিবৃতির সাথে ব্যবহার করা যেতে পারে:

public sealed class AuthenticationMethod
{
    #region This code never needs to change.
    private readonly string _name;
    public readonly Values Value;

    private AuthenticationMethod(Values value, String name){
        this._name = name;
        this.Value = value;
    }

    public override String ToString(){
        return _name;
    }
    #endregion

    public enum Values
    {
        Forms = 1,
        Windows = 2,
        SSN = 3
    }

    public static readonly AuthenticationMethod FORMS = new AuthenticationMethod (Values.Forms, "FORMS");
    public static readonly AuthenticationMethod WINDOWSAUTHENTICATION = new AuthenticationMethod (Values.Windows, "WINDOWS");
    public static readonly AuthenticationMethod SINGLESIGNON = new AuthenticationMethod (Values.SSN, "SSN");
}

সুতরাং আপনি জ্যাকুব স্ুরুরকের উত্তরগুলির সমস্ত সুবিধা পাবেন, প্লাস আমরা এটির মত একটি সুইচ বিবৃতি ব্যবহার করতে পারি:

var authenticationMethodVariable = AuthenticationMethod.FORMS;  // Set the "enum" value we want to use.
var methodName = authenticationMethodVariable.ToString();       // Get the user-friendly "name" of the "enum" value.

// Perform logic based on which "enum" value was chosen.
switch (authenticationMethodVariable.Value)
{
    case authenticationMethodVariable.Values.Forms: // Do something
        break;
    case authenticationMethodVariable.Values.Windows: // Do something
        break;
    case authenticationMethodVariable.Values.SSN: // Do something
        break;      
}

এক্সটেনশান পদ্ধতি হিসাবে আমি কিভাবে এটি সমাধান করেছি:

using System.ComponentModel;
public static string GetDescription(this Enum value)
{
    var descriptionAttribute = (DescriptionAttribute)value.GetType()
        .GetField(value.ToString())
        .GetCustomAttributes(false)
        .Where(a => a is DescriptionAttribute)
        .FirstOrDefault();

    return descriptionAttribute != null ? descriptionAttribute.Description : value.ToString();
}

Enum:

public enum OrderType
{
    None = 0,
    [Description("New Card")]
    NewCard = 1,
    [Description("Reload")]
    Refill = 2
}

ব্যবহার (যেখানে o.OrderType এনাম নামে একই নামের একটি সম্পত্তি):

o.OrderType.GetDescription()

যা আমাকে নিউকার্ড এবং রিফিলের প্রকৃত এননাম মান পরিবর্তে "নতুন কার্ড" বা "পুনরায় লোড করুন" দেয়।


দুর্ভাগ্যবশত enums উপর বৈশিষ্ট্য পেতে প্রতিফলন বেশ ধীর:

এই প্রশ্নটি দেখুন: যে কেউ একটি enum মান থেকে কাস্টম গুণাবলী পেতে দ্রুত উপায় জানেন?

.ToString() এছাড়াও enums খুব ধীর।

যদিও আপনি enums জন্য এক্সটেনশন পদ্ধতি লিখতে পারেন:

public static string GetName( this MyEnum input ) {
    switch ( input ) {
        case MyEnum.WINDOWSAUTHENTICATION:
            return "Windows";
        //and so on
    }
}

এটি দুর্দান্ত নয়, তবে দ্রুত এবং বৈশিষ্ট্যাবলী বা ক্ষেত্রের নামটির প্রতিফলন প্রয়োজন হবে না।

সি # 6 আপডেট

আপনি যদি C # 6 ব্যবহার করতে পারেন তবে নতুন নাম অপারেটর enums জন্য কাজ করে, তাই nameof(MyEnum.WINDOWSAUTHENTICATION) কম্পাইল "WINDOWSAUTHENTICATION" রূপান্তর করা হবে, এটি "WINDOWSAUTHENTICATION" নামগুলি পেতে দ্রুততম উপায় তৈরি করে।

নোট করুন যে এটি সুস্পষ্ট enum কে একটি ইনলাইনযুক্ত ধ্রুবক রূপে রূপান্তরিত করবে, সুতরাং এটি একটি পরিবর্তনশীল আছে এমন এননামগুলির জন্য কাজ করে না। তাই:

nameof(AuthenticationMethod.FORMS) == "FORMS"

কিন্তু ...

var myMethod = AuthenticationMethod.FORMS;
nameof(myMethod) == "myMethod"

নেট 4.0 এবং এর উপরে এর সাথে খুব সহজ সমাধান। অন্য কোন কোড প্রয়োজন হয়।

public enum MyStatus
{
    Active = 1,
    Archived = 2
}

শুধু ব্যবহার সম্পর্কে স্ট্রিং পেতে:

MyStatus.Active.ToString("f");

অথবা

MyStatus.Archived.ToString("f");`

মান "সক্রিয়" বা "সংরক্ষণাগার" হবে।

Enum.ToString কল করার সময় বিভিন্ন স্ট্রিং ফর্ম্যাট (উপরে থেকে "f") দেখতে এই Enum.ToString ফরম্যাট স্ট্রিং পৃষ্ঠাটি দেখুন


যখন আমি এই সমস্যাটির মুখোমুখি হই, তখন আমার কয়েকটি প্রশ্ন আছে যা আমি প্রথমে উত্তরগুলি খুঁজে বের করার চেষ্টা করি:

  • আমার enum নামগুলির নাম কি উদ্দেশ্যে যথেষ্ট বন্ধুত্বপূর্ণ, অথবা আমি বন্ধুত্বপূর্ণ বেশী প্রদান করা প্রয়োজন?
  • আমি বৃত্তাকার ভ্রমণ প্রয়োজন? অর্থাৎ, আমি কি টেক্সট মান গ্রহণ করতে এবং enum মান তাদের পার্স করতে হবে?
  • আমার প্রকল্পে অনেকগুলি মস্তিষ্কের জন্য বা শুধু একের জন্য এইটা কি আমার দরকার?
  • আমি কি ধরনের UI উপাদানগুলি এই তথ্য উপস্থাপন করব - বিশেষ করে, আমি কি UI এ বাঁধাই করব নাকি সম্পত্তি শিটগুলি ব্যবহার করব?
  • এই স্থানীয়করণযোগ্য হতে হবে?

এটি করার সবচেয়ে সহজ উপায় Enum.GetValue (এবং Enum.Parse ব্যবহার করে রাউন্ড- Enum.Parse সমর্থন করে)। স্টিভ মিচাম সুপারিশ করে UI TypeConverter বাইন্ডিং সমর্থন করার জন্য এটি TypeConverter জন্য প্রায়ই মূল্যবান। (যখন আপনি সম্পত্তি শীটগুলি ব্যবহার করছেন তখন TypeConverter তৈরি করা প্রয়োজন নয়, যা সম্পত্তি শীটগুলির সম্পর্কে চমৎকার জিনিসগুলির মধ্যে একটি। যদিও প্রভু জানেন যে তাদের নিজস্ব সমস্যা রয়েছে।)

সাধারণভাবে, উপরের প্রশ্নের উত্তরগুলি যদি কাজ না করার পরামর্শ দেয় তবে আমার পরবর্তী ধাপটি একটি স্ট্যাটিক Dictionary<MyEnum, string> , অথবা সম্ভবত একটি Dictionary<Type, Dictionary<int, string>> তৈরি এবং তৈরি করতে হয়। আমি মধ্যবর্তী সাজসজ্জা-দ্য-কোড-এ-এ্যাট্রিবিউটস ধাপটি এড়িয়ে যাচ্ছি কারণ পরবর্তীতে পাইকটি পরবর্তীতে নেমে আসে তা নির্ধারণের পরে বন্ধুত্বপূর্ণ মানগুলি পরিবর্তন করার প্রয়োজন হয় (প্রায়ই, কিন্তু সর্বদা স্থানীয়করণের কারণে নয়)।


শুধু ToString() পদ্ধতি ব্যবহার করুন

public enum any{Tomato=0,Melon,Watermelon}

স্ট্রিং Tomato রেফারেন্স, শুধু ব্যবহার করুন

any.Tomato.ToString();

পুরাতন পোস্ট কিন্তু ...

এই উত্তর আসলে খুব সহজ হতে পারে। Enum.ToString() ফাংশন ব্যবহার করুন

এই ফাংশনের 6 ওভারলোড রয়েছে, আপনি স্ট্রিং মানটি ফিরিয়ে দিতে Enum.Tostring ("F") বা Enum.ToString () ব্যবহার করতে পারেন। অন্য কিছু সঙ্গে বিরক্ত করার প্রয়োজন নেই। এখানে একটি কাজ ডেমো

মনে রাখবেন এই সমাধানটি সমস্ত কম্পাইলারের জন্য কাজ করবে না ( এই ডেমো প্রত্যাশিত হিসাবে কাজ করে না ) তবে অন্তত এটি সর্বশেষ কম্পাইলারের জন্য কাজ করে।


আমি কিথের সাথে একমত, কিন্তু আমি ভোট দিতে পারছি না (এখনো)।

আমি কি চাই আমি ফিরে একটি স্ট্যাটিক পদ্ধতি এবং swith বিবৃতি ব্যবহার করুন। ডেটাবেসে আমি ছোট্ট স্টোর সঞ্চয় করি এবং আমার কোডটি শুধুমাত্র প্রকৃত enum ব্যবহার করে, তাই স্ট্রিংগুলি UI প্রয়োজনীয়তার জন্য। বহু পরীক্ষার পর এটি সেরা কর্মক্ষমতা এবং আউটপুট উপর সর্বাধিক নিয়ন্ত্রণ ফলে।

public static string ToSimpleString(this enum)
{
     switch (enum)
     {
         case ComplexForms:
             return "ComplexForms";
             break;
     }
}

public static string ToFormattedString(this enum)
{
     switch (enum)
     {
         case ComplexForms:
             return "Complex Forms";
             break;
     }
}

যাইহোক, কিছু অ্যাকাউন্ট দ্বারা, এটি একটি সম্ভাব্য রক্ষণাবেক্ষণ দুঃস্বপ্ন এবং কিছু কোড গন্ধ বাড়ে। আমি দীর্ঘস্থায়ী এবং enums অনেক enums, অথবা ঘন ঘন পরিবর্তন যারা জন্য একটি চোখ রাখা চেষ্টা। অন্যথায়, এই আমার জন্য একটি মহান সমাধান হয়েছে।


আমার জন্য, প্রগমেটিক পদ্ধতি ক্লাসের ভিতরে শ্রেণী, নমুনা:

public class MSEModel
{
    class WITS
    {
        public const string DATE = "5005";
        public const string TIME = "5006";
        public const string MD = "5008";
        public const string ROP = "5075";
        public const string WOB = "5073";
        public const string RPM = "7001";
... 
    }

আমার রূপ

public struct Colors
{
    private String current;

    private static string red = "#ff0000";
    private static string green = "#00ff00";
    private static string blue = "#0000ff";

    private static IList<String> possibleColors; 

    public static Colors Red { get { return (Colors) red; } }
    public static Colors Green { get { return (Colors) green; } }
    public static Colors Blue { get { return (Colors) blue; } }

    static Colors()
    {
        possibleColors = new List<string>() {red, green, blue};
    }

    public static explicit operator String(Colors value)
    {
        return value.current;
    }

    public static explicit operator Colors(String value)
    {
        if (!possibleColors.Contains(value))
        {
            throw new InvalidCastException();
        }

        Colors color = new Colors();
        color.current = value;
        return color;
    }

    public static bool operator ==(Colors left, Colors right)
    {
        return left.current == right.current;
    }

    public static bool operator !=(Colors left, Colors right)
    {
        return left.current != right.current;
    }

    public bool Equals(Colors other)
    {
        return Equals(other.current, current);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (obj.GetType() != typeof(Colors)) return false;
        return Equals((Colors)obj);
    }

    public override int GetHashCode()
    {
        return (current != null ? current.GetHashCode() : 0);
    }

    public override string ToString()
    {
        return current;
    }
}

কোডটি একটু কুৎসিত দেখায়, তবে এই কাঠামোর ব্যবহারগুলি বেশ উপস্থাপক।

Colors color1 = Colors.Red;
Console.WriteLine(color1); // #ff0000

Colors color2 = (Colors) "#00ff00";
Console.WriteLine(color2); // #00ff00

// Colors color3 = "#0000ff"; // Compilation error
// String color4 = Colors.Red; // Compilation error

Colors color5 = (Colors)"#ff0000";
Console.WriteLine(color1 == color5); // True

Colors color6 = (Colors)"#00ff00";
Console.WriteLine(color1 == color6); // False

এছাড়াও, আমি মনে করি, যদি অনেকগুলি এনাম প্রয়োজন হয় তবে কোড প্রজন্ম (যেমন টি 4) ব্যবহার করা যেতে পারে।


এখানে অনেক উত্তরের উত্তর কিন্তু আমার ক্ষেত্রে কোনও "স্ট্রিং এনম" থেকে আমি যা চেয়েছি তা সমাধান করে নি, যা ছিল:

  1. সুইচ বিবৃতিতে ব্যবহারযোগ্য যেমন সুইচ (MyEnum)
  2. ফাংশন পরামিতি যেমন foo (MyEnum টাইপ) ব্যবহার করা যেতে পারে
  3. রেফারেন্স করা যেতে পারে যেমন myEnum.FirstElement
  4. আমি স্ট্রিং ব্যবহার করতে পারি যেমন foo ("firstElement") == foo (myEnum.FirstElement)

1,2 এবং 4 আসলে একটি স্ট্রিংয়ের সি # টাইপিডফ দিয়ে সমাধান করা যেতে পারে (যেহেতু স্ট্রিংগুলি সি # এ পরিবর্তনযোগ্য হয়)

3 স্ট্যাটিক কনস্ট স্ট্রিং দ্বারা সমাধান করা যেতে পারে। সুতরাং যদি আপনার একই প্রয়োজন থাকে তবে এটি সহজতম পদ্ধতি।

public sealed class Types
{

    private readonly String name;

    private Types(String name)
    {
        this.name = name;

    }

    public override String ToString()
    {
        return name;
    }

    public static implicit operator Types(string str)
    {
        return new Types(str);

    }
    public static implicit operator string(Types str)
    {
        return str.ToString();
    }


    #region enum

    public const string DataType = "Data";
    public const string ImageType = "Image";
    public const string Folder = "Folder";
    #endregion

}

এটি উদাহরণস্বরূপ:

    public TypeArgs(Types SelectedType)
    {
        Types SelectedType = SelectedType
    }

এবং

public TypeObject CreateType(Types type)
    {
        switch (type)
        {

            case Types.ImageType:
              //
                break;

            case Types.DataType:
             //
                break;

        }
    }

যেখানে CreateType একটি স্ট্রিং বা একটি টাইপ সঙ্গে বলা যেতে পারে। তবে নেতিবাচক দিক হল যে কোনও স্ট্রিং স্বয়ংক্রিয়ভাবে একটি বৈধ enum হয় , এটি সংশোধন করা যেতে পারে কিন্তু তারপরে এটিতে কিছু ধরণের ইনট ফাংশন প্রয়োজন হবে ... অথবা সম্ভবত তারা স্পষ্টভাবে অভ্যন্তরীণ কাস্টম কাস্ট করতে পারবে?

এখন যদি কোন int মান আপনার জন্য গুরুত্বপূর্ণ (সম্ভবত তুলনা গতির জন্য), আপনি জ্যাকব Šturc চমত্কার উত্তর থেকে কিছু ধারনা ব্যবহার করতে পারেন এবং কিছুটা বিরাট কাজ করতে পারেন , এটি আমার স্ট্যাব:

    public sealed class Types
{
    private static readonly Dictionary<string, Types> strInstance = new Dictionary<string, Types>();
    private static readonly Dictionary<int, Types> intInstance = new Dictionary<int, Types>();

    private readonly String name;
    private static int layerTypeCount = 0;
    private int value;
    private Types(String name)
    {
        this.name = name;
        value = layerTypeCount++;
        strInstance[name] = this;
        intInstance[value] = this;
    }

    public override String ToString()
    {
        return name;
    }


    public static implicit operator Types(int val)
    {
        Types result;
        if (intInstance.TryGetValue(val, out result))
            return result;
        else
            throw new InvalidCastException();
    }

    public static implicit operator Types(string str)
    {
        Types result;
        if (strInstance.TryGetValue(str, out result))
        {
            return result;
        }
        else
        {
            result = new Types(str);
            return result;
        }

    }
    public static implicit operator string(Types str)
    {
        return str.ToString();
    }

    public static bool operator ==(Types a, Types b)
    {
        return a.value == b.value;
    }
    public static bool operator !=(Types a, Types b)
    {
        return a.value != b.value;
    }

    #region enum

    public const string DataType = "Data";
    public const string ImageType = "Image";

    #endregion

}

কিন্তু অবশ্যই "ধরন bob = 4;" যদি না আপনি তাদের প্রথম চালু ছিল, যার অর্থ বিন্দু পরাজিত করা হবে না অর্থহীন হতে হবে ...

কিন্তু তত্ত্ব টাইপএ == TypeB দ্রুত হবে ...


বিকল্প 1:

public sealed class FormsAuth
{
     public override string ToString{return "Forms Authtentication";}
}
public sealed class WindowsAuth
{
     public override string ToString{return "Windows Authtentication";}
}

public sealed class SsoAuth
{
     public override string ToString{return "SSO";}
}

এবং তারপর

object auth = new SsoAuth(); //or whatever

//...
//...
// blablabla

DoSomethingWithTheAuth(auth.ToString());

বিকল্প 2:

public enum AuthenticationMethod
{
        FORMS = 1,
        WINDOWSAUTHENTICATION = 2,
        SINGLESIGNON = 3
}

public class MyClass
{
    private Dictionary<AuthenticationMethod, String> map = new Dictionary<AuthenticationMethod, String>();
    public MyClass()
    {
         map.Add(AuthenticationMethod.FORMS,"Forms Authentication");
         map.Add(AuthenticationMethod.WINDOWSAUTHENTICATION ,"Windows Authentication");
         map.Add(AuthenticationMethod.SINGLESIGNON ,"SSo Authentication");
    }
}


আচ্ছা, উপরের সবগুলো পড়ার পর আমার মনে হয় ছেলেরা স্ট্রিংয়ে এনকুলেটরগুলিকে রূপান্তর করার বিষয়টি জটিল করে দিয়েছে। আমি গাণিতিক ক্ষেত্রগুলির উপর বৈশিষ্ট্য থাকার ধারণাটি পছন্দ করি কিন্তু আমি মনে করি যে বৈশিষ্ট্যটি প্রধানত মেটা-ডেটা জন্য ব্যবহৃত হয়, কিন্তু আপনার ক্ষেত্রে আমি মনে করি যে আপনার যা দরকার তা স্থানীয়করণের মতো।

public enum Color 
{ Red = 1, Green = 2, Blue = 3}


public static EnumUtils 
{
   public static string GetEnumResourceString(object enumValue)
    {
        Type enumType = enumValue.GetType();
        string value = Enum.GetName(enumValue.GetType(), enumValue);
        string resourceKey = String.Format("{0}_{1}", enumType.Name, value);
        string result = Resources.Enums.ResourceManager.GetString(resourceKey);
        if (string.IsNullOrEmpty(result))
        {
            result = String.Format("{0}", value);
        }
        return result;
    }
}

এখন যদি আমরা উপরের পদ্ধতিতে কল করার চেষ্টা করি তবে আমরা এটিকে কল করতে পারি

public void Foo()
{
  var col = Color.Red;
  Console.WriteLine (EnumUtils.GetEnumResourceString (col));
}

আপনাকে যা করতে হবে তা কেবলমাত্র সমস্ত সংখ্যার মান এবং সংশ্লিষ্ট স্ট্রিং সহ একটি সংস্থান ফাইল তৈরি করুন

Resource Name          Resource Value
Color_Red              My String Color in Red
Color_Blue             Blueeey
Color_Green            Hulk Color

আসলে এটি সম্পর্কে খুব ভাল যে এটি যদি আপনার স্থানীয়করণের জন্য আপনার অ্যাপ্লিকেশনের প্রয়োজন হয় তবে এটি খুব সহায়ক হবে, যেহেতু আপনাকে কেবলমাত্র আপনার নতুন ভাষার সাথে অন্য সংস্থান ফাইল তৈরি করতে হবে! এবং ভয়ে-লা!


এমএসডিএন এর উপর ভিত্তি করে: http://msdn.microsoft.com/en-us/library/cc138362.aspx

foreach (string str in Enum.GetNames(typeof(enumHeaderField)))
{
    Debug.WriteLine(str);
}

str ক্ষেত্রের নাম হবে


যদি আপনি সমস্যার বিষয়ে চিন্তা করেন তবে আমরা সমাধান করার চেষ্টা করছি, এটি এমন একটি enum আমরা প্রয়োজন নেই। আমাদের এমন একটি বস্তুর দরকার যা মূল্যের নির্দিষ্ট সংখ্যককে একে অপরের সাথে যুক্ত করতে দেয়; অন্য কথায়, একটি বর্গ সংজ্ঞায়িত করা।

Jakub Šturc এর টাইপ-নিরাপদ enum প্যাটার্ন আমি এখানে দেখতে সেরা বিকল্প।

এটার দিকে দেখ:

  • এটি একটি ব্যক্তিগত কনস্ট্রাক্টর রয়েছে তাই শুধুমাত্র শ্রেণীটি অনুমোদিত অনুমতিগুলি সংজ্ঞায়িত করতে পারে।
  • এটি একটি সিল শ্রেণি তাই ভ্যালু উত্তরাধিকার মাধ্যমে পরিবর্তন করা যাবে না।
  • এটি টাইপ-নিরাপদ, আপনার পদ্ধতিগুলি কেবলমাত্র সেই ধরণের প্রয়োজনের জন্য অনুমতি দেয়।
  • মূল্য অ্যাক্সেস দ্বারা ব্যয় করা কোন প্রতিফলন কর্মক্ষমতা আঘাত আছে।
  • এবং শেষ পর্যন্ত, এটি একাধিক ক্ষেত্রকে একত্রিত করতে সংশোধন করা যেতে পারে, উদাহরণস্বরূপ একটি নাম, বর্ণনা এবং একটি সংখ্যাসূচক মান।






enums