using System; using System.ComponentModel; namespace ZeroLevel { public static class EnumExtensions { /// /// Gets an attribute on an enum field value /// /// The type of the attribute you want to retrieve /// The enum value /// The attribute of type T that exists on the enum value /// string desc = myEnumVariable.GetAttributeOfType().Description; public static T GetAttributeOfType(this Enum enumVal) where T : Attribute { var type = enumVal.GetType(); var memInfo = type.GetMember(enumVal.ToString()); var attributes = memInfo[0].GetCustomAttributes(typeof(T), false); return (attributes.Length > 0) ? (T)attributes[0] : null; } public static string Description(this Enum enumVal) { var attr = enumVal.GetAttributeOfType(); return attr?.Description; } public static T GetValueFromDescription(string description) { var type = typeof(T); if (!type.IsEnum) throw new InvalidOperationException(); foreach (var field in type.GetFields()) { var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if (attribute != null) { if (attribute.Description == description) return (T)field.GetValue(null); } else { if (field.Name == description) return (T)field.GetValue(null); } } throw new ArgumentException("Not found.", nameof(description)); // or return default(T); } } }