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!
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.
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With