22

I am new with C# and I have some troubles with enum.

I have Enum defined like this:

public enum CustomFields
{
    [Display(Name = "first_name")]
    FirstName = 1,

    [Display(Name = "last_name")]
    LastName = 2,
}

What I need is code which will check does display name exist and if so return enum value.

So if I have display name:

var name = "first_name";

I need something like:

var name = "first_name";
CustomFields.getEnumValue(name);

This should return:

CustomFields.FirstName;
abatishchev
  • 98,240
  • 88
  • 296
  • 433
carpics
  • 2,272
  • 4
  • 28
  • 56

2 Answers2

40

You could use generics:

    public class Program
    {
        private static void Main(string[] args)
        {
            var name = "first_name";
            CustomFields customFields = name.GetValueFromName<CustomFields>();
        }
    }

    public enum CustomFields
    {
        [Display(Name = "first_name")]
        FirstName = 1,

        [Display(Name = "last_name")]
        LastName = 2,
    }


    public static T GetValueFromName<T>(this string name) where T : Enum
    {
        var type = typeof(T);

        foreach (var field in type.GetFields())
        {
            if (Attribute.GetCustomAttribute(field, typeof(DisplayAttribute)) is DisplayAttribute attribute)
            {
                if (attribute.Name == name)
                {
                    return (T)field.GetValue(null);
                }
            }

            if (field.Name == name)
            {
                return (T)field.GetValue(null);
            }
        }

        throw new ArgumentOutOfRangeException(nameof(name));
    }
openshac
  • 4,966
  • 5
  • 46
  • 77
1

Try the following.

void Main()
{   
    CustomFields value1 = GetEnumValue("first_name");
    CustomFields value2 = GetEnumValue("last_name");
}

static Dictionary<string, CustomFields> displayNameMapping;

static CustomFields GetEnumValue(String displayName){
    if (displayNameMapping == null){
        var enumType = typeof(CustomFields);
        var displayAttributeType = typeof(DisplayAttribute);
        CustomFields? found = null;

        displayNameMapping = new Dictionary<string, CustomFields>();
        Enum.GetNames(enumType).ToList().ForEach(name=>{
            var member = enumType.GetMember(name).First();
            var displayAttrib = (DisplayAttribute)member.GetCustomAttributes(displayAttributeType, false).First();
            displayNameMapping.Add(displayAttrib.Name, (CustomFields)Enum.Parse(enumType, name));
        });
    }

    return displayNameMapping[displayName];
}

// Define other methods and classes here
public enum CustomFields
{
    [Display(Name = "first_name")]
    FirstName = 1,

    [Display(Name = "last_name")]
    LastName = 2,
}
Don
  • 6,632
  • 3
  • 26
  • 34