Mega Code Archive

 
Categories / C# / Data Types
 

Retrieves the enum field associated with the specified value A return value indicates whether the conversion succeeded

using System; using System.Reflection; namespace SnapDragon.Utilities {   /// <summary>   /// Provides methods for retrieving enum and attribute values through reflection.   /// </summary>   public static class AttributeReflector   {     /// <summary>     /// Converts the string representation of the specified enum value.     /// </summary>     /// <typeparam name="T">Type of attribute to parse.</typeparam>     /// <param name="value">A string containing the value to parse.</param>     /// <param name="output">When this method returns, contains the attribute value, if the conversion succeeded, or default if it fails.</param>     /// <returns></returns>     public static bool TryParse<T>(string value, out T output)     {       output = default(T);       if(!Enum.IsDefined(typeof(T), value))       {         return false;       }       output = (T) Enum.Parse(typeof (T), value, true);       return true;     }     /// <summary>     /// Retrieves the enum field associated with the specified value. A return value indicates whether the conversion succeeded.     /// </summary>     /// <typeparam name="T">Type of enum.</typeparam>     /// <typeparam name="TAttribute">Type of attribute to retrieve.</typeparam>     /// <param name="value">Value of the attribute.</param>     /// <param name="output"></param>     /// <param name="predicate"></param>     /// <returns></returns>     public static bool TryGetFieldFromAttributeValue<T, TAttribute>(string value, out T output, Func<TAttribute, string> predicate)       where TAttribute : Attribute     {       output = default(T);       bool found = false;       string attributeValue = null;       Type type = typeof(T);       FieldInfo[] fields = type.GetFields();       // needs to start at 1 because GetFields includes a __value for enums       for (int i = 1; i < fields.Length; ++i)       {         //Check for our custom attribute         TAttribute[] attrs = fields[i].GetCustomAttributes(typeof(TAttribute), false) as TAttribute[];         if (attrs != null && attrs.Length != 0)         {           attributeValue = predicate(attrs[0]);         }         //Check for equality then select actual enum value.         if (string.Compare(attributeValue, value, true) == 0)         {           output = (T)Enum.Parse(type, fields[i].Name);           found = true;           break;         }       }       return found;     }   } }