Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enum.TryParse with Flags attribute

Tags:

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) => v != 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!

like image 232
Sunny Avatar asked Apr 30 '10 14:04

Sunny


People also ask

What is the role of flag attribute in enums?

The [Flag] attribute is used when Enum represents a collection of multiple possible values rather than a single value. All the possible combination of values will come. The [Flags] attribute should be used whenever the enumerable represents a collection of possible values, rather than a single value.

What does enum TryParse do?

TryParse(Type, String, Object)Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object.

What is TEnum?

TEnum is the Generic type of enumeration. You can pass any of your enumeration to that method. The second method is a non-generic one, where you would use a typeof keyword to identify the enums and return the enum names as a string collection.


1 Answers

Flags enums are written using , by using the .Net convention and not |. Enum.Parse() works perfectly when using ',' strings:

[Flags] public enum Flags {     A = 1,     B = 2,     C = 4,     D = 8, }  var enumString =  (Flags.A | Flags.B | Flags.C).ToString(); Console.WriteLine(enumString); // Outputs: A, B, C Flags f = (Flags)Enum.Parse(typeof(Flags),  enumString); Console.WriteLine(f); // Outputs: A, B, C 
like image 89
Pop Catalin Avatar answered Oct 08 '22 16:10

Pop Catalin