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.