using System.ComponentModel;
using System.Diagnostics;
public static void Main()
Console.WriteLine("Readable name of Outer.inher.val is: " + EnumHelper.GetReadableName(inher.val));
Func<Enum, long> GetNameLoop = x => {
var sw = new Stopwatch();
for(int i = iterations; i>0; i--){
EnumHelper.GetReadableName(x);
return sw.ElapsedMilliseconds;
Console.WriteLine("Base: " + GetNameLoop(en.val) + "ms");
Console.WriteLine("Inherited: " + GetNameLoop(inher.val) + "ms");
public static class EnumHelper{
public static string GetReadableName(Enum e){
string output = string.Empty;
DescriptionAttribute descriptionAttribute = e.GetType().GetField(e.ToString())
.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute;
if(descriptionAttribute!=null){
output = descriptionAttribute.Description;
BaseEnum baseEnum = e.GetType().GetCustomAttribute(typeof(BaseEnum)) as BaseEnum;
FieldInfo baseValue = baseEnum.BaseType.GetField(e.ToString());
descriptionAttribute = baseValue.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute;
if(descriptionAttribute!=null){
output = descriptionAttribute.Description;
[AttributeUsage(AttributeTargets.Enum)]
public class BaseEnum : Attribute
public Type BaseType {get; set;}