Particularmente, gosto bastante de trabalhar com enumeradores. Nada melhor que o auto-complete falando exatamente os valores possíveis para determinada propriedade. Alguns exemplos de dados que podem ser usados como enumeradores são:
- Dias da semana
- Nome dos meses
- Máquinas de estados finita
- Estações do ano
São dados conhecidos, com número limitado de opções, portanto é útil ler esses dados como valores textuais ao invés de numéricos.
Observe esses exemplos e me diga, qual deles é mais fácil de entender.
var season = 1; // O que significa "1"???
Ou este.
var season = seasons.summer;
Aqui com time de desenvolvimento da BNP, combinamos que, ao lidar com enumeradores, trabalhar com seus valores textuais de ponta a ponta (backend, frontend, banco de dados, DTOs etc.).
Isso facilita o time de suporte, por exemplo, para entender mais rápido o que significa o valor de alguma propriedade.
ENUMs e sua particularidade no C#
Por padrão, o C# e o Entity Framework transformam o ENUM para seu valor numérico. Isso atrapalha bastante a leitura do dado ao dar manutenção diretamente no banco de dados, você precisa necessariamente ter uma colinha com o significado dos valores numéricos 😥.
Como seguir a convenção da equipe com essa limitação técnica?
Para resolver essa questão, criei um projeto minimal api de exemplo, que modifica o comportamento dos enumeradores.
Primeiro, defini um modelo base. Aqui o importante é a propriedade Tags
Agora, para criar o enumerador como texto, vou usar um DescriptionAttribute chamado “description” e não vou informar nenhum valor numérico para os valores do enum
Para facilitar a leitura, estou mantendo o attribute e o valor do enum na mesma linha
Com isso já temos um enumerador que trabalha apenas com texto (kinda).
O problema é que ao salvar nossa entidade no banco de dados, o Entity Framework converte automaticamente o enum em valor numérico.
Daí preciso explicar para o EF que ele deve trabalhar com o enum de forma semântica
Primeiro criamos uma classe para recuperar o valor da description no enum
Então na definição de contexto precisamos criar um conversor de LISTA DE ENUM para ARRAY DE TEXTO SEPARADOS POR VIRGULA.
Atenção, aqui quem faz a conversão é a tagsConverter
Agora sim. Enumerador como texto de ponta a ponta. 👏🏻
O link para o projeto completo no GitHub 👇🏻👇🏻👇🏻
https://github.com/quatoo/c-sharp-enum-to-string
Abraços galera e até a próxima 👋🏻
Seja o primeiro a comentar