23

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;

2 Answers 2

41

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));
    }
Sign up to request clarification or add additional context in comments.

Comments

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,
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.