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

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




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

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 ، يوجد خطأ في الكود: 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 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());



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

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

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

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




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

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

أفترض هنا أنك تريد إرجاع شيء آخر غير الاسم الفعلي لقيمة التعداد (التي يمكنك الحصول عليها ببساطة عن طريق استدعاء 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



هذا هو تحديث لرمز 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();
    }   



Related