سؤال

لا أحد يعرف كيفية تحويل قيمة تعداد الإنسان للقراءة قيمة ؟

على سبيل المثال:

ThisIsValueA يجب أن يكون "هذا هو قيمة".

هل كانت مفيدة؟

المحلول

تحويل هذا من vb البرمجية المتكررة أن بعض إيان Horwill اليسار في بلوق وظيفة منذ فترة طويلة...كنت منذ المستخدمة في الإنتاج بنجاح.

    /// <summary>
    /// Add spaces to separate the capitalized words in the string, 
    /// i.e. insert a space before each uppercase letter that is 
    /// either preceded by a lowercase letter or followed by a 
    /// lowercase letter (but not for the first char in string). 
    /// This keeps groups of uppercase letters - e.g. acronyms - together.
    /// </summary>
    /// <param name="pascalCaseString">A string in PascalCase</param>
    /// <returns></returns>
    public static string Wordify(string pascalCaseString)
    {            
        Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])");
        return r.Replace(pascalCaseString, " ${x}");
    }

(يتطلب 'باستخدام النظام.النص.RegularExpressions;')

وبالتالي:

Console.WriteLine(Wordify(ThisIsValueA.ToString()));

سيعود ،

"This Is Value A".

الأمر أبسط من ذلك بكثير و أقل زائدة من تقديم وصف السمات.

سمات مفيدة هنا فقط إذا كنت تحتاج إلى توفير طبقة من المراوغة (مسألة لم أطلب).

نصائح أخرى

على .ToString على Enums بطيئة نسبيا في C# ، مقارنة مع GetType().اسم (حتى أنه قد استخدم هذا تحت الأغطية).

إذا كان الحل الخاص بك يحتاج إلى أن تكون سريعة جدا أو ذات كفاءة عالية قد تكون أفضل من التخزين المؤقت التحويلات الخاصة بك في القاموس ثابت و يبحث لهم من هناك.


صغير التكيف @ليون رمز للاستفادة من C#3.هذا معنى امتدادا enums - هل يمكن أن تحد من هذا إلى نوع معين إذا كنت لا تريد أن تحدث فوضى كل منهم.

public static string Wordify(this Enum input)
{            
    Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])");
    return r.Replace( input.ToString() , " ${x}");
}

//then your calling syntax is down to:
MyEnum.ThisIsA.Wordify();

معظم الأمثلة من هذا أن رأيت تنطوي على علامات الخاص بك التعداد القيم مع [الوصف] سمات باستخدام انعكاس للقيام "التحويل" بين قيمة و الوصف.وهنا قديم بلوق وظيفة حول هذا الموضوع:

http://geekswithblogs.net/rakker/archive/2006/05/19/78952.aspx

يمكن أن ترث من "السمة" فئة من النظام.التفكير إلى إنشاء الخاصة بك "الوصف" الطبقة.مثل هذا (من هنا):

using System;
using System.Reflection;
namespace FunWithEnum
{
    enum Coolness : byte
    {
        [Description("Not so cool")]
        NotSoCool = 5,
        Cool, // since description same as ToString no attr are used
        [Description("Very cool")]
        VeryCool = NotSoCool + 7,
        [Description("Super cool")]
        SuperCool
    }
    class Description : Attribute
    {
        public string Text;
        public Description(string text)
        {
            Text = text;
        }
    }
    class Program
    {
        static string GetDescription(Enum en)
        {
            Type type = en.GetType();
            MemberInfo[] memInfo = type.GetMember(en.ToString());
            if (memInfo != null && memInfo.Length > 0)
            {
                object[] attrs = memInfo[0].GetCustomAttributes(typeof(Description), false);
                if (attrs != null && attrs.Length > 0)
                    return ((Description)attrs[0]).Text;
            }
            return en.ToString();
        }
        static void Main(string[] args)
        {
            Coolness coolType1 = Coolness.Cool;
            Coolness coolType2 = Coolness.NotSoCool;
            Console.WriteLine(GetDescription(coolType1));
            Console.WriteLine(GetDescription(coolType2));
        }
    }
}

يمكنك أيضا أن تأخذ نظرة على هذا المقال: http://www.codeproject.com/KB/cs/enumdatabinding.aspx

هو على وجه التحديد حول ربط البيانات ، ولكن يظهر كيفية استخدام سمة لتزيين التعداد القيم و يوفر "GetDescription" طريقة استرداد النص من السمة.المشكلة مع استخدام المدمج في وصف السمة هو أن هناك استخدامات أخرى/المستخدمين من أن السمة لذلك هناك احتمال أن الوصف يظهر حيث كنت لا ترغب في ذلك.السمة المخصصة يحل هذه المسألة.

وجدت أنه من الأفضل تحديد التعداد القيم تحت درجة حتى ThisIsValueA سيكون This_Is_Value_A ثم يمكنك فقط القيام enumValue.toString().Replace("_"," ") حيث enumValue هو varible.

بديل إضافة Description سمات كل التعداد هو خلق طريقة التمديد.إعادة استخدام آدم "البرودة" التعداد:

public enum Coolness
{
    NotSoCool,
    Cool,
    VeryCool,
    SuperCool
}

public static class CoolnessExtensions
{
    public static string ToString(this Coolness coolness)
    {
        switch (coolness)
        {
            case Coolness.NotSoCool:
                return "Not so cool";
            case Coolness.Cool:
                return "Cool";
            case Coolness.VeryCool:
                return "Very cool";
            case Coolness.SuperCool:
                return Properties.Settings.Default["SuperCoolDescription"].ToString();
            default:
                throw new ArgumentException("Unknown amount of coolness", nameof(coolness));
        }
    }
}

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top