Enum.Parse – Você vai esquecer que usava switch para isso…

10 F Y

Quantas vezes você precisou recuperar os dados de, por exemplo, uma drop-down list contendo o estado em que seu usuário mora, e converter isso para o seu tipo enum Estados? Quantas vezes você já escreveu switches enormes, um case para cada campo de seu enum, só pra poder converter o valor que veio numa string, igual ao nome do campo da enum, para o tipo da enumeração? Seus problemas acabaram…

O método Enum.Parse resolve isto para você em uma (ou algumas poucas mais…) linha. Se você tem uma enum Estado, em que cada campo é a sigla do estado, você pode usar o seguinte:

string estadoUsuarioString = "PE";
Estado estadoUsuarioEnum = (Estado) Enum.Parse(typeof(Estado), estadoUsuarioString);

Só isso… ao fim da execução, estadoUsuarioEnum vai ter como valor Estado.PE, sem precisar de todos aqueles cases que você estava acostumado. Então alguém me diz: “O nome dos campos de minha enum estão todos em maiúsculas, mas o valor que vem do usuário vem em minúsculas (ou misturado, miguxês, qualquer forma que não sejam todas maiúsculas…). Isso é inútil pra mim”. É aí que esta pessoa se engana. Além da assinatura Enum.Parse (Type, String), podemos usar a assinatura Enum.Parse (Type, String, Boolean). O Boolean que você vai passar é indicando se o match será case-sensitive ou não. Usar sem passar o parâmetro é igual a passá-lo como true. Passar false fará os retornos de

(Estado) Enum.Parse(typeof(Estado), "pe", false);
(Estado) Enum.Parse(typeof(Estado), "pE", false);
(Estado) Enum.Parse(typeof(Estado), "Pe", false);
(Estado) Enum.Parse(typeof(Estado), "PE", false);

serem iguais a Estado.PE.

Devemos lembrar que se não existir na sua enumeração um campo com nome igual (ou igual case insensitive, para a assinatura com Boolean), o método retorna uma exceção (System.ArgumentException), então devemos usá-lo com cuidado para não estourarmos um erro na tela do usuário. Por segurança, o método deveria estar dentro de um try-catch (daí o ou algumas poucas linhas a mais), onde o tratamento do catch seria o código que você escrevia no “default:” de seu obsoleto switch.

Confesso que antes de encontrar algo na net sobre isso, usei switch várias vezes, e comecei procurando errado, pensando que não existia nada “pronto” para fazer isso. Procurei por alguma técnica usando Reflection e seus Invokes, e encontrei várias pessoas com a mesma dúvida em fóruns… sempre, depois de vários posts chegava alguém e perguntava: “O que você quer não é usar Enum.Parse?” :)… O que não dá pra fazer (que seja suficientemente “simples”…) em uma linha no .NET Framework?

Para mais informações: http://msdn.microsoft.com/en-us/library/system.enum.parse(VS.80).aspx