Data Types C#

using System;
using System.Reflection;
namespace SnapDragon.Utilities
{
  /// 
  /// Provides methods for retrieving enum and attribute values through reflection.
  /// 

  public static class AttributeReflector
  {
    /// 
    /// Converts the string representation of the specified enum value.
    /// 

    /// Type of attribute to parse.
    /// A string containing the value to parse.
    /// When this method returns, contains the attribute value, if the conversion succeeded, or default if it fails.
    /// 
    public static bool TryParse(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;
    }
    /// 
    /// Retrieves the enum field associated with the specified value. A return value indicates whether the conversion succeeded.
    /// 

    /// Type of enum.
    /// Type of attribute to retrieve.
    /// Value of the attribute.
    /// 
    /// 
    /// 
    public static bool TryGetFieldFromAttributeValue(string value, out T output, Func 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;
    }
  }
}