Parsing strings to enums

Not something that's needed very often but sometimes we can need to get an enum value from a string, perhaps a value returned from an API you have no control over.

In general, parsing a string to an enum can be done using either

(EnumType)Enum.Parse(typeof(EnumType), stringToConvert);

or

(EnumType)Enum.Parse(typeof(EnumType), stringToConvert, ignoreCase);

This can be used to create an extension method allowing any string to be converted to an enum of any specified type.

/// <summary>
/// Parses a string into an enumeration of Type T
/// </summary>
/// <typeparam name="T">The Enumerator Type</typeparam>
/// <param name="s">The string to parse</param>
/// <param name="defaultValue">The default enumerator to use if the string cannot be parsed</param>
/// <returns>A enumeration of Type T</returns>
public static T ToEnum<T>(this string s, T defaultValue)
{
    if (string.IsNullOrEmpty(s))
    {
        return defaultValue;
    }

    try
    {
       return (T)Enum.Parse(typeof(T), s, true);
    }
    catch (ArgumentException ex)
    {
       return defaultValue;
    }
}

As the default value specifies the enum type, it isn't necessary to explicitly identify the enum type we wish to cast to.
An example would be to convert the name of a day to the appropriate DayOfWeek enum

string day = "Wednesday";
var dayOfWeek = day.ToEnum(DayOfWeek.Monday);
// dayOfWeek = DayOfWeek.Wednesday

string day = "wednesday";
var dayOfWeek = day.ToEnum(DayOfWeek.Monday);
// dayOfWeek = DayOfWeek.Wednesday

string invalidDay = "Wednesdayy";
var dayOfWeek = invalidDay.ToEnum(DayOfWeek.Monday);
// dayOfWeek = DayOfWeek.Monday

An advantage of this approach is that we can specify a default enum which will be used in case a parsing fails as in the final example above


Share Tweet Send
0 Comments
Loading...
You've successfully subscribed to SimonReynolds.ie
Great! Next, complete checkout for full access to SimonReynolds.ie
Welcome back! You've successfully signed in
Success! Your account is fully activated, you now have access to all content.