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;
}
}