static void Main(string[] args) { List<string> tests = new List<string>() { "TypeTester.NonExist", "TypeTester.Thing", "TypeTester.Fruit", "TypeTester.Color" }; PrintEnums(); foreach (var item in tests) { try { ConvertFromTypeName(item); } catch (TypeLoadException) { Console.WriteLine("Could not load {0}", item); } catch (ArgumentException e) { Console.WriteLine(e.Message); } } Console.ReadLine(); } static void PrintEnums() { Console.WriteLine("Printing Fruit"); foreach (Fruit thing in Enum.GetValues(typeof(Fruit))) { Console.WriteLine("Value: {0}, Description: {1}", (int)thing, thing.GetDescription()); } Console.WriteLine("Printing Color"); foreach (Color thing in Enum.GetValues(typeof(Color))) { Console.WriteLine("Value: {0}, Description: {1}", (int)thing, thing.GetDescription()); } } static void ConvertFromTypeName(string typeName) { Type type = Type.GetType(typeName, true); if (!type.IsEnum) throw new ArgumentException(typeName + " is not an enum."); Console.WriteLine("UnderlingType: {0}", type.UnderlyingSystemType); string description = string.Empty; foreach ( var thing in Enum.GetValues((type.UnderlyingSystemType))) { //This will not compile //Console.WriteLine("Value: {0}, Description: {1}", (int)thing, thing.GetDescription()); Console.WriteLine("Value: {0}, Description: {1}", (int)thing, thing.ToString()); } } } public class Thing { public int Id { get; set; } public string MyName { get; set; } } public enum Fruit { [System.ComponentModel.DescriptionAttribute("I am an apple")] Apple = 8, [System.ComponentModel.DescriptionAttribute("I am an Banana")] Banana, [System.ComponentModel.DescriptionAttribute("I am an Grape")] Grape, [System.ComponentModel.DescriptionAttribute("I am an Kiwi")] Kiwi, [System.ComponentModel.DescriptionAttribute("I am an Orange")] Orange } public enum Color { [System.ComponentModel.DescriptionAttribute("I am the color Red")] Red = 56, [System.ComponentModel.DescriptionAttribute("I am the color Green")] Green, [System.ComponentModel.DescriptionAttribute("I am the color Blue")] Blue, [System.ComponentModel.DescriptionAttribute("I am the color Black")] Black, [System.ComponentModel.DescriptionAttribute("I am the color White")] White } public static class Helper { public static string GetDescription(this Enum value) { System.Reflection.FieldInfo field = value.GetType().GetField(value.ToString()); System.ComponentModel.DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(System.ComponentModel.DescriptionAttribute)) as System.ComponentModel.DescriptionAttribute; return attribute == null ? value.ToString() : attribute.Description; } } Why in ConvertFromTypeName if the underlying type is Fruit or Color I cannot call the GetDescription extension method? It seems to not to be able to infer that from the var. I would like this to work just like PrintEnums, the GetDescription extension.
Printing Fruit Value: 8, Description: I am an apple Value: 9, Description: I am an Banana Value: 10, Description: I am an Grape Value: 11, Description: I am an Kiwi Value: 12, Description: I am an Orange Printing Color Value: 56, Description: I am the color Red Value: 57, Description: I am the color Green Value: 58, Description: I am the color Blue Value: 59, Description: I am the color Black Value: 60, Description: I am the color White Could not load TypeTester.NonExist TypeTester.Thing is not an enum. UnderlingType: TypeTester.Fruit Value: 8, Description: Apple Value: 9, Description: Banana Value: 10, Description: Grape Value: 11, Description: Kiwi Value: 12, Description: Orange UnderlingType: TypeTester.Color Value: 56, Description: Red Value: 57, Description: Green Value: 58, Description: Blue Value: 59, Description: Black Value: 60, Description: White