Generic type restriction for enums
I was looking for a way to restrict a generic type identifier to only allow enums. Since you are not allowed to use where T : Enum, I checked the metadata 
for Enum and found that it implements ValueType, IComparable, IFormattable, IConvertible. 
You can't use ValueType as restriction, but struct works fine.
In other words, use “where T : struct, IComparable, IFormattable, IConvertible” to make a type restriction which should work well as an enum restriction.
The reason why I needed the specification is that I want to be able to fetch the DescriptionAttribute from enums. I use it to be able to add friendly names to enum values.
Example enum:
public enum MyEnum
{
    [Description("Some value"]
    SomeValue,
    [Description("Foo bar")]
    FooBar
}
Fetch value:
MyEnum value = MyEnum.FooBar;
// will display "Foo bar"
Console.WriteLine(value.GetDescription());
The extension method that does the magic:
public static string GetDescription<T>(this T instance)
    where T : struct, IConvertible, IFormattable, IComparable
{
    var type = typeof (T);
    var memberInfo = type.GetMember(instance.ToString())[0];
    var attribute = (DescriptionAttribute)memberInfo.GetCustomAttributes(
        typeof(DescriptionAttribute), false).FirstOrDefault();
    return attribute == null ? instance.ToString() : attribute.Description;
}
						Post Comment
cQk5n9 Thanks for sharing, this is a fantastic blog article.Much thanks again. Really Cool.