شرح - كيفية الحصول على وصف التعداد C#من القيمة؟




struct in c# (4)

ممكن تكرار:
الحصول على سمات قيمة التعداد

لدي تعداد مع سمات الوصف مثل هذا:

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

ما أريد القيام به هو إذا كنت أعرف قيمة التعداد (مثل 1) - كيف يمكنني استرداد الوصف؟ بمعنى آخر ، كيف يمكنني تحويل عدد صحيح إلى "قيمة التعداد" لتمريرها إلى طريقة GetDescription الخاصة بي؟


أضع الشفرة معًا من الإجابة المقبولة في طريقة إضافة عامة ، بحيث يمكن استخدامها لجميع أنواع الكائنات:

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();
}

باستخدام التعداد كما هو الحال في المشاركة الأصلية ، أو أي فئة أخرى تم تصميم الخاصية الخاصة بها مع سمة الوصف ، يمكن استهلاك الشفرة كما يلي:

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

لا يمكنك القيام بذلك بسهولة بطريقة عامة: يمكنك فقط تحويل عدد صحيح إلى نوع معين من التعداد. وكما أوضح نيكولاس ، فإن هذا الأمر بسيط للغاية إذا كنت تهتم فقط بنوع واحد من التعداد ، ولكن إذا كنت ترغب في كتابة أسلوب عام قادر على التعامل مع أنواع مختلفة من التعدادات ، فإن الأمور تصبح أكثر تعقيدًا بعض الشيء. تريد طريقة على غرار خطوط:

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
}

يمكنك الآن الاتصال بهذا للحصول على وصف لأي نوع من التعدادات في متناول اليد:

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

لقد قمت بتطبيق هذا بطريقة عامة آمنة من النوع في Melodystrained Melody - يمكنك استخدام:

string description = Enums.GetDescription((MyEnum)value);

هذه:

  • يضمن (مع قيود النوع العام) أن القيمة هي قيمة تعداد
  • يتجنب الملاكمة في الحل الحالي
  • يخبئ كل الأوصاف لتجنب استخدام التأمل في كل مكالمة
  • لديه مجموعة من الأساليب الأخرى ، بما في ذلك القدرة على تحليل القيمة من الوصف

أدرك أن الإجابة الأساسية كانت فقط من فريق البحث إلى MyEnum ، ولكن إذا كنت تقوم بالكثير من أعمال التعداد ، فيجب التفكير في استخدام Unconstrained Melody :)


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

نوع البيانات الأساسي الافتراضي enum في C # هو int ، يمكنك فقط إرساله.





enums