/* Based on http://stackoverflow.com/a/31839145/107625 It didn't work correctly with an enum like: [Flags] public enum Test1 { [Description("Letter-A")] A = 0x00, // Special case: Zero, no flags. [Description("Letter-B")] B = 0x01, [Description("Letter-C")] C = 0x02, [Description("Letter-D")] D = 0x04, [Description("Letter-E")] E = 0x08 } My below solution (hopefully!) corrects the above false behaviour. Be aware that this _only_ works for enums with [Flags] attribute. It does _not_ work for enums without the [Flags] attribute. Some unit tests: [Flags] public enum Test1 { [D("Letter-A")] A = 0x00, // Special case: Zero, no flags. [D("Letter-B")] B = 0x01, [D("Letter-C")] C = 0x02, [D("Letter-D")] D = 0x04, [D("Letter-E")] E = 0x08 } public enum Test2 { [D("Letter-A")] A, [D("Letter-B")] B, [D("Letter-C")] C, [D("Letter-D")] D, [D("Letter-E")] E } [Test] public void TestEnum1() { const Test1 t1 = Test1.A; const Test1 t2 = Test1.B; const Test1 t3 = Test1.B | Test1.C; var d1 = StringHelper.GetEnumDescription(t1); var d2 = StringHelper.GetEnumDescription(t2); var d3 = StringHelper.GetEnumDescription(t3); Assert.AreEqual(d1, "Letter-A"); Assert.AreEqual(d2, "Letter-B"); Assert.AreEqual(d3, "Letter-B, Letter-C"); } [Test] public void TestEnum2() { const Test2 t1 = Test2.A; const Test2 t2 = Test2.B; const Test2 t3 = Test2.C; var d1 = StringHelper.GetEnumDescription(t1); var d2 = StringHelper.GetEnumDescription(t2); var d3 = StringHelper.GetEnumDescription(t3); Assert.AreEqual(d1, "Letter-A"); Assert.AreEqual(d2, "Letter-B"); Assert.AreEqual(d3, "Letter-C"); } */ public static string GetDescription(Enum value) { Type type = value.GetType(); var values = Enum.GetValues(type); var setValues = new List(); foreach(var enumValue in values) { if ((int) enumValue == 0) // Added check. { if (value.Equals(enumValue)) setValues.Add((Enum) enumValue); } else { if (value.HasFlag((Enum) enumValue)) setValues.Add((Enum) enumValue); } } var stringList = new List(); foreach (var singleValue in setValues) { var name = Enum.GetName(type, singleValue); if (name != null) { FieldInfo field = type.GetField(name); if (field != null) { DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if (attr != null) { stringList.Add(attr.Description); } } } } return string.Join(", ", stringList.ToArray()); }