[C#] التعداد ToString مع سلاسل سهلة الاستخدام



Answers

أفعل هذا مع طرق التمديد:

public enum ErrorLevel
{
  None,
  Low,
  High,
  SoylentGreen
}

public static class ErrorLevelExtensions
{
  public static string ToFriendlyString(this ErrorLevel me)
  {
    switch(me)
    {
      case ErrorLevel.None:
        return "Everything is OK";
      case ErrorLevel.Low:
        return "SNAFU, if you know what I mean.";
      case ErrorLevel.High:
        return "Reaching TARFU levels";
      case ErrorLevel.SoylentGreen:
        return "ITS PEOPLE!!!!";
      default:
        return "Get your damn dirty hands off me you FILTHY APE!";
    }
  }
}
Question

يتكون التعداد الخاص بي من القيم التالية:

private enum PublishStatusses{
    NotCompleted,
    Completed,
    Error
};

أريد أن أتمكن من إخراج هذه القيم بطريقة سهلة الاستخدام.
لا أحتاج إلى الانتقال من السلسلة إلى القيمة مرة أخرى.




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

public static class EnumExtensions
{
    public static string ToFriendlyString(this Enum code)
    {
        return Enum.GetName(code.GetType(), code);
    }
}

الاستعمال:

enum ExampleEnum
{
    Demo = 0,
    Test = 1, 
    Live = 2
}

...

ExampleEnum ee = ExampleEnum.Live;
Console.WriteLine(ee.ToFriendlyString());



الحل الأسهل هنا هو استخدام أسلوب ملحق مخصص (في .NET 3.5 على الأقل - يمكنك فقط تحويله إلى أسلوب مساعد ثابت لإصدارات الإطار السابقة).

public static string ToCustomString(this PublishStatusses value)
{
    switch(value)
    {
        // Return string depending on value.
    }
    return null;
}

أفترض هنا أنك تريد إرجاع شيء آخر غير الاسم الفعلي لقيمة التعداد (التي يمكنك الحصول عليها ببساطة عن طريق استدعاء ToString).




حتى ملخص أنظف:

using System;
using System.Reflection;

public class TextAttribute : Attribute
{
    public string Text;
    public TextAttribute(string text)
    {
        Text = text;
    }
}  

public static class EnumExtender
{
    public static string ToText(this Enum enumeration)
    {
        var memberInfo = enumeration.GetType().GetMember(enumeration.ToString());
        if (memberInfo.Length <= 0) return enumeration.ToString();

        var attributes = memberInfo[0].GetCustomAttributes(typeof(TextAttribute), false);
        return attributes.Length > 0 ? ((TextAttribute)attributes[0]).Text : enumeration.ToString();
    }
}

نفس الاستخدام كما يصف الشرطة السفلية.




هذا هو تحديث لرمز Ray Booysen الذي يستخدم أسلوب GetCustomAttributes العام و LINQ لجعل الأمور أكثر ترتيباً.

    /// <summary>
    /// Gets the value of the <see cref="T:System.ComponentModel.DescriptionAttribute"/> on an struct, including enums.  
    /// </summary>
    /// <typeparam name="T">The type of the struct.</typeparam>
    /// <param name="enumerationValue">A value of type <see cref="T:System.Enum"/></param>
    /// <returns>If the struct has a Description attribute, this method returns the description.  Otherwise it just calls ToString() on the struct.</returns>
    /// <remarks>Based on http://.com/questions/479410/enum-tostring/479417#479417, but useful for any struct.</remarks>
    public static string GetDescription<T>(this T enumerationValue) where T : struct
    {
        return enumerationValue.GetType().GetMember(enumerationValue.ToString())
                .SelectMany(mi => mi.GetCustomAttributes<DescriptionAttribute>(false),
                    (mi, ca) => ca.Description)
                .FirstOrDefault() ?? enumerationValue.ToString();
    }   



تلك الوظيفة الأخرى هي جافا. لا يمكنك وضع أساليب في التعدادات في C #.

فقط افعل شيئًا كهذا:

PublishStatusses status = ...
String s = status.ToString();

إذا كنت ترغب في استخدام قيم عرض مختلفة لقيم التعداد ، فيمكنك استخدام السمات والتأمل.




فيما يتعلق Ray Booysen ، يوجد خطأ في الكود: Enum ToString مع سلاسل سهلة الاستخدام

تحتاج إلى حساب لسمات متعددة على قيم التعداد.

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 && attrs.Where(t => t.GetType() == typeof(DescriptionAttribute)).FirstOrDefault() != null)
            {
                //Pull out the description value
                return ((DescriptionAttribute)attrs.Where(t=>t.GetType() == typeof(DescriptionAttribute)).FirstOrDefault()).Description;
            }
        }
        //If we have no description attribute, just return the ToString of the enum
        return enumerationValue.ToString();



أعتقد أن أفضل طريقة (وأسهل) لحل مشكلتك هي كتابة أسلوب ملحق لتعدادك:

public static string GetUserFriendlyString(this PublishStatusses status)
    {

    }



ملخص نظيف للاقتراحات الواردة أعلاه مع عينة:

namespace EnumExtensions {

using System;
using System.Reflection;

public class TextAttribute : Attribute {
   public string Text;
   public TextAttribute( string text ) {
      Text = text;
   }//ctor
}// class TextAttribute

public static class EnumExtender {

public static string ToText( this Enum enumeration ) {

   MemberInfo[] memberInfo = enumeration.GetType().GetMember( enumeration.ToString() );

   if ( memberInfo != null && memberInfo.Length > 0 ) {

      object[] attributes = memberInfo[ 0 ].GetCustomAttributes( typeof(TextAttribute),  false );

      if ( attributes != null && attributes.Length > 0 ) {
         return ( (TextAttribute)attributes[ 0 ] ).Text;
      }

   }//if

   return enumeration.ToString();

}//ToText

}//class EnumExtender

}//namespace

الاستعمال:

using System;
using EnumExtensions;

class Program {

public enum Appearance {

  [Text( "left-handed" ) ]
  Left,

  [Text( "right-handed" ) ]
  Right,

}//enum

static void Main( string[] args ) {

   var appearance = Appearance.Left;
   Console.WriteLine( appearance.ToText() );

}//Main

}//class





Links