¿Cómo creo automáticamente una enumeración y luego uso sus valores en C # según los valores en una tabla de búsqueda de base de datos (usando la capa de datos de la biblioteca empresarial)?
Por ejemplo, si agrego un nuevo valor de búsqueda en la base de datos, no quiero tener que agregar manualmente la declaración de valor de enumeración estática adicional en el código; me gustaría mantener la enumeración sincronizada con la base de datos.
¿Existe algo como esto?
No quiero crear una enumeración estática generada por código (según el artículo de The Code Project Generador de código de enumeración: generación de código de enumeración automáticamente desde las tablas de búsqueda de la base de datos ) y preferiría que fuera completamente automático.
Respuestas:
Estoy haciendo exactamente esto, pero necesitas hacer algún tipo de generación de código para que esto funcione.
En mi solución, agregué un proyecto "EnumeratedTypes". Esta es una aplicación de consola que obtiene todos los valores de la base de datos y construye las enumeraciones a partir de ellos. Luego, guarda todas las enumeraciones en un ensamblado.
El código de generación de enumeración es así:
Mis otros proyectos en la solución hacen referencia a este ensamblado generado. Como resultado, puedo usar las enumeraciones dinámicas en el código, completo con intellisense.
Luego, agregué un evento posterior a la compilación para que después de compilar este proyecto "EnumeratedTypes", se ejecute solo y genere el archivo "MyEnums.dll".
Por cierto, es útil cambiar el orden de construcción de su proyecto para que "EnumeratedTypes" se compile primero. De lo contrario, una vez que comience a usar su .dll generado dinámicamente, no podrá hacer una compilación si el .dll alguna vez se elimina. (Problema de la gallina y el huevo: sus otros proyectos en la solución necesitan este .dll para compilarse correctamente, y no puede crear el .dll hasta que cree su solución ...)
Obtuve la mayor parte del código anterior de Obtuve este artículo de msdn .
¡Espero que esto ayude!
fuente
Las enumeraciones deben especificarse en tiempo de compilación, no puede agregar dinámicamente enumeraciones durante el tiempo de ejecución, y ¿por qué lo haría? ¿No habría uso / referencia a ellas en el código?
Desde Professional C # 2008:
Por lo tanto, no estoy seguro de que pueda usar Enums de la manera que desee.
fuente
System.Enum
tiene alguna funcionalidad adicional). En lugar de escribirconst int Red=0, Green=1, Blue=3;
, escribesenum { Red, Green, Blue }
. Una constante es por definición constante y no dinámica.¿Tiene que ser una enumeración real? ¿Qué tal usar un
Dictionary<string,int>
en su lugar?por ejemplo
fuente
Hice esto con una plantilla T4 . Es bastante trivial colocar un archivo .tt en su proyecto y configurar Visual Studio para ejecutar la plantilla T4 como un paso previo a la compilación.
El T4 genera un archivo .cs, lo que significa que puede hacer que solo consulte la base de datos y cree una enumeración en un archivo .cs a partir del resultado. Conectado como una tarea previa a la compilación, volvería a crear su enumeración en cada compilación, o puede ejecutar el T4 manualmente según sea necesario.
fuente
Digamos que tiene lo siguiente en su base de datos:
Construya una selección para obtener los valores que necesita:
Construya el código fuente de la enumeración y obtendrá algo como:
(obviamente, esto se construye en un bucle de algún tipo).
Luego viene la parte divertida, compilar su enumeración y usarla:
Ahora tiene el tipo compilado y listo para usar.
Para obtener un valor de enumeración almacenado en la base de datos, puede usar:
donde valor puede ser el valor entero (0, 1, etc.) o el texto / clave de enumeración (Apple, Banana, etc.)
fuente
Solo mostrando la respuesta de Pandincus con el código "del estante" y alguna explicación: Necesitas dos soluciones para este ejemplo (sé que también se podría hacer a través de una;), deja que los estudiantes avanzados la presenten ...
Entonces aquí está el SQL DDL para la tabla:
Así que aquí está el programa de consola que produce el dll:
Aquí está la programación de la consola imprimiendo la salida (recuerde que tiene que hacer referencia a la dll). Deje que los estudiantes avanzados presenten la solución para combinar todo en una solución con carga dinámica y verificar si ya existe una dll de compilación.
fuente
flagFileExists
cuando no se usa en ningún otro lugar de la aplicación?¿No estamos llegando a esto desde la dirección equivocada?
Si es probable que los datos cambien durante la vida útil de la versión implementada, entonces una enumeración simplemente no es apropiada y debe usar un diccionario, hash u otra colección dinámica.
Si sabe que el conjunto de valores posibles está fijo durante la vida útil de la versión implementada, es preferible una enumeración.
Si debe tener algo en su base de datos que replique el conjunto enumerado, ¿por qué no agregar un paso de implementación para borrar y volver a llenar la tabla de la base de datos con el conjunto definitivo de valores de enumeración?
fuente
Siempre me gusta escribir mi propia "enumeración personalizada". De lo que tengo una clase que es un poco más compleja, pero puedo reutilizarla:
Ahora solo necesito crear mi enumeración que quiero usar:
Por fin puedo usarlo como quiero:
Y mi salida sería:
fuente
Quieres System.Web.Compilation.BuildProvider
También dudo de la sabiduría de hacer esto, pero tal vez haya un buen caso de uso en el que no puedo pensar.
Lo que está buscando son proveedores de compilación, es decir, System.Web.Compilation.BuildProvider
SubSonic los usa de manera muy efectiva , puede descargar la fuente y ver cómo los usan, no necesitará nada ni la mitad de complicado de lo que están haciendo.
Espero que esto ayude.
fuente
Puede usar CodeSmith para generar algo como esto:
http://www.csharping.com/PermaLink,guid,cef1b637-7d37-4691-8e49-138cbf1d51e9.aspx
fuente
No creo que haya una buena forma de hacer lo que quieres. Y si lo piensas, no creo que esto sea lo que realmente quieres.
Si tuviera una enumeración dinámica, también significa que debe alimentarla con un valor dinámico cuando haga referencia a ella. Tal vez con mucha magia podría lograr algún tipo de IntelliSense que se encargaría de esto y generaría una enumeración para usted en un archivo DLL. Pero considere la cantidad de trabajo que tomaría, lo poco efectivo que sería acceder a la base de datos para obtener información de IntelliSense, así como la pesadilla de la versión que controla el archivo DLL generado.
Si realmente no desea agregar manualmente los valores de enumeración (tendrá que agregarlos a la base de datos de todos modos), use una herramienta de generación de código, por ejemplo, plantillas T4 . Haga clic derecho + ejecutar y obtendrá su enumeración definida estáticamente en el código y obtendrá todos los beneficios de usar enumeraciones.
fuente
El uso de enumeraciones dinámicas es malo sin importar de qué manera. Tendrá que tomarse la molestia de "duplicar" los datos para garantizar un código claro y fácil de mantener en el futuro.
Si comienza a introducir bibliotecas generadas automáticamente, seguramente está causando más confusión a los futuros desarrolladores que tengan que actualizar su código que simplemente hacer que su enumeración esté codificada dentro del objeto de clase apropiado.
Los otros ejemplos dados suenan agradables y emocionantes, pero piense en la sobrecarga del mantenimiento del código en comparación con lo que obtiene de él. Además, ¿esos valores van a cambiar con tanta frecuencia?
fuente
Una forma de mantener las enumeraciones y crear una lista dinámica de valores al mismo tiempo es utilizar las enumeraciones que tiene actualmente con un diccionario creado dinámicamente.
Dado que la mayoría de las enumeraciones se utilizan en el contexto en el que están definidas para su uso, y las "enumeraciones dinámicas" serán compatibles con procesos dinámicos, puede distinguir el 2.
El primer paso es crear una tabla / colección que contenga los ID y las referencias de las entradas dinámicas. En la tabla, el autoincremento será mucho mayor que el valor de enumeración más grande.
Ahora viene la parte de sus Enums dinámicos, supongo que usará los Enums para crear un conjunto de condiciones que aplican un conjunto de reglas, algunas se generan dinámicamente.
fuente
clase de constructor de enumeración
crear un objeto
fuente