Muitas vezes nos criamos Enums para expressar possiveis opcoes/valores de um campo de multipla escolha onde os itens sao fixos do sistema e nao cadastrados em uma tabela.Ha casos em que os itens definem regras de negocio e rumos a tomar na aplicacao. Nesses casos usar enum nao e a melhor opcao.Em todos os outros casos usar enum pode ser legal, mas existe um problema: como popular um combo box / dropdown list com os itens do combo com nomes amigaveis? Sim, voce nao pode colocar espacos e caracteres especiais em um enum. Mas ao popular as opcoes, seja em uma aplicacao windows forms ou web forms, voce pode querer mostrar descricoes longas e cheias de acentos e caracteres especiais para as opcoes no dropdown.Voce pode usar os atributos Description ou EnumMember para definir programaticamente essas descricoes longas, mas obter esses valores de volta vai algumas linhas de codigo.Nesse codigo que eu compartilho abaixo escrevi um extension method (nao abuse deles) para o tipo enum chamado ToText() que tenta obter o Description, se nao existir tenta obter o EnumMember, e se nao existir eu criei um outro, chamado text, para exemplificar como podemos adicionar a qualquer membro do codigo propriedades e valores declarativamente atraves de atributos.Voce pode adaptar outros atributos, ou separar Description, EnumMember e Text em metodos separados se desejar.using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Reflection;using System.ComponentModel;using System.Runtime.Serialization;namespace VtrFramework.Extensions{ /// /// classe que permite usar um atributo texto em um item de enum, para ele ter uma descricao amigavel /// public class TextAttribute : Attribute { public string Text; public TextAttribute(string text) { Text = text; } } /// /// Adiciona um metodo a mais em um elemento do tipo enum para pegarmos seu texto amigavel /// public static class EnumExtensions { /// /// Dado um enum, retorna seu correspondente string que pode ser: "" se ele for null, Seu decorator/atributo Text se houver, ToString caso contrario /// funciona tambem com o atributo Description e com o atributo EnumMember /// /// O Enum a ser convertido /// string - O texto do enum public static string ToText(this Enum enumeration) { if (enumeration == null) { return ""; } MemberInfo[] memberInfo = enumeration.GetType().GetMember(enumeration.ToString()); if (memberInfo != null && memberInfo.Length > 0) { try { object[] descrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); if (descrs != null && descrs.Length > 0) { return ((DescriptionAttribute)descrs[0]).Description; } object[] enumbs = memberInfo[0].GetCustomAttributes(typeof(EnumMemberAttribute), false); if (enumbs != null && enumbs.Length > 0) { return ((EnumMemberAttribute)enumbs[0]).Value; } object[] txts = memberInfo[0].GetCustomAttributes(typeof(TextAttribute), false); if (txts != null && txts.Length > 0) { return ((TextAttribute)txts[0]).Text; } } catch { //catch mudinho porque o fallback e direto para o ToString } } return enumeration.ToString(); } }}Use-o assim: namespace VtrFramework.Test.Extensions{ [TestFixture, Description("Teste de metodos de extensao para enuns"), Category("ExtensionMethods")] public class EnumExtensionsTest { public enum TargetEnum { [System.ComponentModel.Description("Opcao 1")] Opcao1, [EnumMember(Value ="Opcao 2")] Opcao2, [Text("Opcao 3")] Opcao3, Opcao4 } [Test] [Description("Teste de metodo que traz descricao amigavel do enum")] [Category("ExtensionMethods")] public void ToTextTest() { Assert.AreEqual("Opcao 1", TargetEnum.Opcao1.ToText()); Assert.AreEqual("Opcao 2", TargetEnum.Opcao2.ToText()); Assert.AreEqual("Opcao 3", TargetEnum.Opcao3.ToText()); Assert.AreEqual("Opcao4", TargetEnum.Opcao4.ToText()); } }}Voce pode popular listbox e dropdowns assim: /// <summary> ///