Enum.TryParse with Flags attribute

Posted by Sunny on Stack Overflow See other posts from Stack Overflow or by Sunny
Published on 2010-04-30T14:46:01Z Indexed on 2010/04/30 14:47 UTC
Read the original article Hit count: 200

Filed under:
|
|
|
|

I have written code to TryParse enum either by value or by its name as shown below. How can I extend this code to include parsing enums with Flags attribute?

    public static bool TryParse<T>(this T enum_type, object value, out T result) 
                where T : struct
            {
                return enum_type.TryParse<T>(value, true, out result);
            }



 public static bool TryParse<T>(this T enum_type, 
object value, bool ignoreCase, out T result)
        where T : struct
    {
        result = default(T);
        var is_converted = false;

        var is_valid_value_for_conversion = new Func<T, object, bool, bool>[]{
            (e, v, i) => e.GetType().IsEnum,
            (e, v, i) => value != null,
            (e, v, i) => Enum.GetNames(e.GetType()).Any(n => String.Compare(n, v.ToString(), i) == 0) || Enum.IsDefined(e.GetType(), v)
        };

        if(is_valid_value_for_conversion.All(rule => rule(enum_type, value, ignoreCase))){
            result = (T)Enum.Parse(typeof(T), value.ToString(), ignoreCase);
            is_converted = true;
        }

        return is_converted;
    }

Currently this code works for the following enums:

enum SomeEnum{ A, B, C } 
// can parse either by 'A' or 'a'

enum SomeEnum1 : int { A = 1, B = 2, C = 3 } 
// can parse either by 'A' or 'a' or 1 or "1"

Does not work for:

[Flags]
enum SomeEnum2 { A = 1, B = 2, C = 4 } // can parse either by 'A' or 'a'
// cannot parse for A|B

Thanks!

© Stack Overflow or respective owner

Related posts about c#

Related posts about .NET