LAB – Armazenando enums como texto

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 😥.

De novo!!! O que significa “1”???

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 👋🏻

Sobre Filipe Borges 10 Artigos
Coordenador do time de desenvolvimento na BNP Soluções em TI. Ex-treinador de overwatch. Viciado em resolução de problemas. Sommelier de café não-oficial e pai do Heitor

Seja o primeiro a comentar

Faça um comentário

Seu e-mail não será divulgado.


*