I was looking for a way to restrict a generic type identifier to only allow enum
s. 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 enum
s. 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;
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;
}