How to set space on Enum

后端 未结 14 1388
栀梦
栀梦 2020-11-29 08:00

I want to set the space on my enum. Here is my code sample:

public enum category
{
    goodBoy=1,
    BadBoy
}

I want to set



        
相关标签:
14条回答
  • 2020-11-29 08:30

    I used Regex to split the values by capital letter and then immediately join into a string with a space between each string in the returned array.

    string.Join(" ", Regex.Split(v.ToString(), @"(?<!^)(?=[A-Z])"));
    

    First get the values of the enum:

    var values = Enum.GetValues(typeof(Category));
    

    Then loop through the values and use the code above to get the values:

    var ret = new Dictionary<int, string>();
    
    foreach (Category v in values)
    {
       ret.Add((int)v, string.Join(" ", Regex.Split(v.ToString(), @"(?<!^)(?=[A-Z])")));
    } 
    

    In my case I needed a dictionary with the value and display name so that it why I have the variable "ret"

    0 讨论(0)
  • 2020-11-29 08:33

    Based on Smac's suggestion, I've added an extension method for ease, since I'm seeing a lot of people still having issues with this.

    I've used the annotations and a helper extension method.

    Enum definition:

    internal enum TravelClass
    {
        [Description("Economy With Restrictions")]
        EconomyWithRestrictions,
        [Description("Economy Without Restrictions")]
        EconomyWithoutRestrictions
    }
    

    Extension class definition:

    internal static class Extensions
    {
        public static string ToDescription(this Enum value)
        {
            FieldInfo field = value.GetType().GetField(value.ToString());
            DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
            return attribute == null ? value.ToString() : attribute.Description;
        }
    }
    

    Example using the enum:

    var enumValue = TravelClass.EconomyWithRestrictions;
    string stringValue = enumValue.ToDescription();
    

    This will return Economy With Restrictions.

    Hope this helps people out as a complete example. Once again, credit goes to Smac for this idea, I just completed it with the extension method.

    0 讨论(0)
  • 2020-11-29 08:36

    You cannot have enum with spaces in .Net. This was possible with earlier versions of VB and C++ of course, but not any longer. I remember that in VB6 I used to enclose them in square brackets, but not in C#.

    0 讨论(0)
  • 2020-11-29 08:38

    You can decorate your Enum values with DataAnnotations, so the following is true:

    using System.ComponentModel.DataAnnotations;
    
    public enum Boys
    {
        [Display(Name="Good Boy")]
        GoodBoy,
        [Display(Name="Bad Boy")]
        BadBoy
    }
    

    I'm not sure what UI Framework you're using for your controls, but ASP.NET MVC can read DataAnnotations when you type HTML.LabelFor in your Razor views.

    Here' a Extension method

    If you are not using Razor views or if you want to get the names in code:

    public class EnumExtention
    {
        public Dictionary<int, string> ToDictionary(Enum myEnum)
        {
            var myEnumType = myEnum.GetType();
            var names = myEnumType.GetFields()
                .Where(m => m.GetCustomAttribute<DisplayAttribute>() != null)
                .Select(e => e.GetCustomAttribute<DisplayAttribute>().Name);
            var values = Enum.GetValues(myEnumType).Cast<int>();
            return names.Zip(values, (n, v) => new KeyValuePair<int, string>(v, n))
                .ToDictionary(kv => kv.Key, kv => kv.Value);
        }
    }
    

    Then use it:

    Boys.GoodBoy.ToDictionary()
    
    0 讨论(0)
  • 2020-11-29 08:41
    using System.ComponentModel;
    

    then...

    public enum category
    {
        [Description("Good Boy")]
        goodboy,
        [Description("Bad Boy")]
        badboy
    }
    

    Solved!!

    0 讨论(0)
  • 2020-11-29 08:44

    Developing on user14570's (nice) workaround referred above, here's a complete example:

        public enum MyEnum
        {
            My_Word,
            Another_One_With_More_Words,
            One_More,
            We_Are_Done_At_Last
        }
    
        internal class Program
        {
            private static void Main(string[] args)
            {
                IEnumerable<MyEnum> values = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>();
                List<string> valuesWithSpaces = new List<string>(values.Select(v => v.ToString().Replace("_", " ")));
    
                foreach (MyEnum enumElement in values)
                    Console.WriteLine($"Name: {enumElement}, Value: {(int)enumElement}");
    
                Console.WriteLine();
                foreach (string stringRepresentation in valuesWithSpaces)
                    Console.WriteLine(stringRepresentation);
            }
        }
    

    Output:

    0 讨论(0)
提交回复
热议问题