Although your question about constraining T to an Enum has been answered by [Vivek](http://stackoverflow.com/a/79903) and the additional comments, I think your resulting function `ParseEnum` can be improved by those comments and 'new' developments:

 - use `TEnum` for clarity for users
 - add more interface-constraints for additional constraint-checking
 - let [`TryParse`](http://msdn.microsoft.com/en-us/library/dd991317.aspx) handle `ignoreCase` with the existing parameter
 (introduced in VS2010/.Net 4) 
 - optionally use the generic [`default` value](http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx) (introduced in VS2005/.Net 2)
 - use [optional arguments](http://msdn.microsoft.com/en-us/library/dd264739.aspx)(introduced in VS2010/.Net 4) with default values, for `defaultValue` and `ignoreCase`

resulting in:

 public static class EnumUtils
 {
 public static TEnum ParseEnum<TEnum>(this string value,
 bool ignoreCase = true,
 TEnum defaultValue = default(TEnum))
 where TEnum : struct, IComparable, IFormattable, IConvertible
 {
 if ( ! typeof(TEnum).IsEnum) { throw new ArgumentException("TEnum must be an enumerated type"); }
 if (string.IsNullOrEmpty(value)) { return defaultValue; }
 TEnum lResult;
 if (Enum.TryParse(value, ignoreCase, out lResult)) { return lResult; }
 return defaultValue;
 }
 }