Como faço para criar automaticamente um enum e, subsequentemente, usar seus valores em C # com base em valores em uma tabela de pesquisa de banco de dados (usando a camada de dados da biblioteca corporativa)?
Por exemplo, se eu adicionar um novo valor de pesquisa no banco de dados, não quero ter que adicionar manualmente a declaração de valor enum estático extra no código - gostaria de manter o enum sincronizado com o banco de dados.
Existe algo assim?
Não quero criar um enum estático gerado por código (de acordo com o artigo Enum Code Generator do The Code Project - Gerando código enum automaticamente a partir de tabelas de pesquisa de banco de dados ) e preferiria que fosse totalmente automático.
Respostas:
Estou fazendo exatamente isso, mas você precisa fazer algum tipo de geração de código para que isso funcione.
Em minha solução, adicionei um projeto "EnumeratedTypes". Este é um aplicativo de console que obtém todos os valores do banco de dados e constrói os enums a partir deles. Em seguida, ele salva todos os enums em uma montagem.
O código de geração de enum é assim:
Meus outros projetos na solução fazem referência a esse assembly gerado. Como resultado, posso usar os enums dinâmicos no código, completos com intellisense.
Em seguida, adicionei um evento pós-compilação para que, após a construção deste projeto "EnumeratedTypes", ele execute a si mesmo e gere o arquivo "MyEnums.dll".
A propósito, ajuda a alterar a ordem de construção de seu projeto para que "EnumeratedTypes" seja construído primeiro. Caso contrário, depois de começar a usar seu .dll gerado dinamicamente, você não conseguirá fazer uma compilação se o .dll for excluído. (O tipo de problema do ovo e da galinha - seus outros projetos na solução precisam desse .dll para ser compilado corretamente, e você não pode criar o .dll até criar sua solução ...)
Peguei a maior parte do código acima neste artigo do msdn .
Espero que isto ajude!
fonte
Os enums devem ser especificados em tempo de compilação, você não pode adicionar enums dinamicamente durante o tempo de execução - e por que faria isso, não haveria uso / referência a eles no código?
Do Professional C # 2008:
Portanto, não tenho certeza se você pode usar Enums da maneira que deseja.
fonte
System.Enum
tenha alguma funcionalidade adicional). Em vez de escrever,const int Red=0, Green=1, Blue=3;
você escreveenum { Red, Green, Blue }
. Uma constante é, por definição, constante e não dinâmica.Tem que ser um enum real? Que tal usar um
Dictionary<string,int>
?por exemplo
fonte
Eu fiz isso com um modelo T4 . É bastante trivial colocar um arquivo .tt em seu projeto e configurar o Visual Studio para executar o modelo T4 como uma etapa de pré-construção.
O T4 gera um arquivo .cs, o que significa que você pode fazer com que ele apenas consulte o banco de dados e crie um enum em um arquivo .cs a partir do resultado. Conectado como uma tarefa de pré-compilação, ele recriaria seu enum em cada compilação, ou você pode executar o T4 manualmente conforme necessário.
fonte
Digamos que você tenha o seguinte em seu banco de dados:
Construa uma seleção para obter os valores de que você precisa:
Construa o código-fonte para o enum e você obterá algo como:
(obviamente, isso é construído em algum tipo de loop.)
Em seguida, vem a parte divertida, Compilar seu enum e usá-lo:
Agora você tem o tipo compilado e pronto para uso.
Para obter um valor enum armazenado no banco de dados, você pode usar:
onde o valor pode ser o valor inteiro (0, 1, etc.) ou o texto / chave enum (Apple, Banana, etc.)
fonte
Apenas mostrando a resposta do Pandincus com o código "da prateleira" e alguma explicação: Você precisa de duas soluções para este exemplo (eu sei que também poderia ser feito por meio de uma;), deixe os alunos avançados apresentá-la ...
Então, aqui está o DDL SQL para a tabela:
Então, aqui está o programa do console produzindo a dll:
Aqui está a programação do console imprimindo a saída (lembre-se de que ela deve fazer referência à dll). Deixe os alunos avançados apresentarem a solução para combinar tudo em uma solução com carregamento dinâmico e verificar se já existe uma DLL construída.
fonte
flagFileExists
quando não é usado em nenhum outro lugar do aplicativo?Não estamos vindo da direção errada?
Se houver probabilidade de alteração dos dados durante o tempo de vida da versão implantada, um enum simplesmente não é apropriado e você precisa usar um dicionário, hash ou outra coleção dinâmica.
Se você souber que o conjunto de valores possíveis é fixo durante a vida útil da versão implantada, um enum é preferível.
Se você deve ter algo em seu banco de dados que replique o conjunto enumerado, por que não adicionar uma etapa de implantação para limpar e preencher novamente a tabela de banco de dados com o conjunto definitivo de valores enum?
fonte
Eu sempre gosto de escrever meu próprio "enum personalizado". Então, tenho uma classe um pouco mais complexa, mas posso reutilizá-la:
Agora só preciso criar meu enum que desejo usar:
Enfim posso usá-lo como quiser:
E minha saída seria:
fonte
Você deseja System.Web.Compilation.BuildProvider
Também duvido da sensatez de fazer isso, mas talvez haja um bom caso de uso que eu não consigo pensar.
O que você está procurando são provedores de compilação, ou seja, System.Web.Compilation.BuildProvider
Eles são usados de forma muito eficaz pelo SubSonic , você pode baixar o código-fonte e ver como eles os usam, você não vai precisar de nada tão complicado quanto o que eles estão fazendo.
Espero que isto ajude.
fonte
Você pode usar CodeSmith para gerar algo assim:
http://www.csharping.com/PermaLink,guid,cef1b637-7d37-4691-8e49-138cbf1d51e9.aspx
fonte
Não acho que haja uma boa maneira de fazer o que você quer. E se você pensar bem, não acho que é isso que você realmente quer.
Se você tiver um enum dinâmico, também significa que deve alimentá-lo com um valor dinâmico ao fazer referência a ele. Talvez com muita magia você pudesse obter algum tipo de IntelliSense que cuidaria disso e geraria um enum para você em um arquivo DLL. Mas considere a quantidade de trabalho que seria necessária, o quão ineficaz seria acessar o banco de dados para buscar informações do IntelliSense, bem como o pesadelo da versão controlando o arquivo DLL gerado.
Se você realmente não deseja adicionar manualmente os valores enum (você terá que adicioná-los ao banco de dados de qualquer maneira), use uma ferramenta de geração de código, por exemplo, modelos T4 . Clique com o botão direito + execute e você terá seu enum definido estaticamente no código e terá todos os benefícios de usar enums.
fonte
Usar enums dinâmicos é ruim, não importa o caminho. Você terá que se dar ao trabalho de "duplicar" os dados para garantir um código claro e fácil de manter no futuro.
Se você começar a introduzir bibliotecas geradas automaticamente, com certeza causará mais confusão para futuros desenvolvedores, tendo que atualizar seu código do que simplesmente codificar seu enum dentro do objeto de classe apropriado.
Os outros exemplos dados parecem bons e empolgantes, mas pense sobre a sobrecarga na manutenção do código em comparação com o que você obtém com isso. Além disso, esses valores vão mudar com tanta frequência?
fonte
Uma maneira de manter os Enums e criar uma lista dinâmica de valores ao mesmo tempo é usar os Enums que você tem atualmente com um Dicionário criado dinamicamente.
Como a maioria dos Enums são usados no contexto em que foram definidos para serem usados e os "enums dinâmicos" serão suportados por processos dinâmicos, você pode distinguir os 2.
A primeira etapa é criar uma tabela / coleção que abrigue os IDs e referências para as entradas dinâmicas. Na tabela, você fará um incremento automático muito maior do que seu maior valor Enum.
Agora vem a parte de seus Enums dinâmicos, estou assumindo que você usará os Enums para criar um conjunto de condições que aplicam um conjunto de regras, algumas são geradas dinamicamente.
fonte
classe construtor enum
criar um objeto
fonte