c# मूल्य से सी#एनम विवरण कैसे प्राप्त करें?




enums (4)

int value = 1;
string description = Enumerations.GetEnumDescription((MyEnum)value);

सी # में एक enum लिए डिफ़ॉल्ट अंतर्निहित डेटा प्रकार एक int , आप बस इसे कास्ट कर सकते हैं।

संभावित डुप्लिकेट:
एनम के मूल्य के गुण प्राप्त करना

मेरे पास विवरण विशेषताओं के साथ एक enum है:

public enum MyEnum
{
    Name1 = 1,
    [Description("Here is another")]
    HereIsAnother = 2,
    [Description("Last one")]
    LastOne = 3
}

मुझे एनम के आधार पर विवरण पुनर्प्राप्त करने के लिए कोड का यह बिट मिला

public static string GetEnumDescription(Enum value)
{
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DescriptionAttribute[] attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute),
        false);

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

यह मुझे कोड लिखने की अनुमति देता है जैसे:

var myEnumDescriptions = from MyEnum n in Enum.GetValues(typeof(MyEnum))
                         select new { ID = (int)n, Name = Enumerations.GetEnumDescription(n) };

मैं क्या करना चाहता हूं अगर मुझे enum मान पता है (उदाहरण 1) - मैं विवरण कैसे प्राप्त कर सकता हूं? दूसरे शब्दों में, मैं अपने गेटडिस्क्रिप्शन विधि को पास करने के लिए एक पूर्णांक को "एनम वैल्यू" में कैसे परिवर्तित कर सकता हूं?


इसका उपयोग करना आसान बनाने के लिए, मैंने एक सामान्य विस्तार लिखा:

public static string ToDescription<TEnum>(this TEnum EnumValue) where TEnum : struct
{
    return Enumerations.GetEnumDescription((Enum)(object)((TEnum)EnumValue));
}

अब मैं लिख सकता हूं:

        MyEnum my = MyEnum.HereIsAnother;
        string description = my.ToDescription();
        System.Diagnostics.Debug.Print(description);

नोट: अपने वर्ग नाम के साथ उपरोक्त "गणना" को प्रतिस्थापित करें


आप सामान्य रूप से इसे सामान्य तरीके से नहीं कर सकते: आप केवल एक पूर्णांक के एक पूर्ण प्रकार में एक पूर्णांक को परिवर्तित कर सकते हैं। जैसा कि निकोलस ने दिखाया है, यह एक मामूली कास्ट है यदि आप केवल एक प्रकार की enum की देखभाल करते हैं, लेकिन यदि आप एक सामान्य विधि लिखना चाहते हैं जो विभिन्न प्रकार के enums को संभाल सकता है, चीजें थोड़ा और जटिल हो जाती है। आप के साथ एक विधि चाहते हैं:

public static string GetEnumDescription<TEnum>(int value)
{
  return GetEnumDescription((Enum)((TEnum)value));  // error!
}

लेकिन इसका परिणाम एक कंपाइलर त्रुटि में होता है कि "int को TENum में परिवर्तित नहीं किया जा सकता" (और यदि आप इसके आसपास काम करते हैं, तो "TENum को Enum में परिवर्तित नहीं किया जा सकता")। तो आपको ऑब्जेक्ट पर कास्ट डालने से कंपाइलर को मूर्ख बनाना होगा:

public static string GetEnumDescription<TEnum>(int value)
{
  return GetEnumDescription((Enum)(object)((TEnum)(object)value));  // ugly, but works
}

आप अब यह कहने के लिए कह सकते हैं कि किस तरह के enum हाथ में है:

GetEnumDescription<MyEnum>(1);
GetEnumDescription<YourEnum>(2);

मैंने कोड को एक सामान्य विस्तार विधि में स्वीकार किए गए उत्तर से एक साथ रखा है, इसलिए इसका उपयोग सभी प्रकार की वस्तुओं के लिए किया जा सकता है:

public static string DescriptionAttr<T>(this T source)
{
    FieldInfo fi = source.GetType().GetField(source.ToString());

    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute), false);

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

मूल पोस्ट, या किसी भी अन्य वर्ग की तरह एक enum का उपयोग करना जिसका गुण विवरण विशेषता से सजाया गया है, कोड इस तरह से उपभोग किया जा सकता है:

string enumDesc = MyEnum.HereIsAnother.DescriptionAttr();
string classDesc = myInstance.SomeProperty.DescriptionAttr();




enums