Create Generic method constraining T to an Enum

Posted by johnc on Stack Overflow See other posts from Stack Overflow or by johnc
Published on 2008-09-17T01:56:19Z Indexed on 2010/04/18 5:43 UTC
Read the original article Hit count: 388

Filed under:
|
|

I'm building a function to extend the Enum.Parse concept that

  • allows a default value to be parsed in case that an Enum value is not found
  • Is case insensitive

So I wrote the following

        public static T GetEnumFromString<T>(string value, T defaultValue) where T : Enum
        {
            if (string.IsNullOrEmpty(value)) return defaultValue;
            foreach (T item in Enum.GetValues(typeof(T)))
            {
                if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
            }
            return defaultValue;
        }

I am getting a Error Constraint cannot be special class 'System.Enum'

Fair enough, but is there a workaround to allow a Generic Enum, or am I going to have to mimic the Parse function and pass a type as an attribute, which forces the ugly boxing requirement to your code.

EDIT All suggestions below have been greatly appreciated, thanks

Have settled on (I've left the loop to maintain case insensitivity - I am usng this when parsing XML)

public static class EnumUtils
{
    public static T ParseEnum<T>(string value, T defaultValue) where T : struct, IConvertible
    {
        if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");
        if (string.IsNullOrEmpty(value)) return defaultValue;

        foreach (T item in Enum.GetValues(typeof(T)))
        {
            if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
        }
        return defaultValue;
    }
}

© Stack Overflow or respective owner

Related posts about c#

Related posts about generics