Как мне автоматически создать перечисление и впоследствии использовать его значения в C # на основе значений в таблице поиска базы данных (с использованием уровня данных корпоративной библиотеки)?
Например, если я добавляю новое значение поиска в базу данных, мне не нужно вручную добавлять объявление дополнительного статического значения перечисления в код - я бы хотел, чтобы перечисление было синхронизировано с базой данных.
Есть такая вещь?
Я не хочу , чтобы создать код генерируется статическое перечисление (согласно коду проекту статьи Enum генератор коды - Генерация кода перечисления автоматически из базы данных вида таблиц ) и предпочел бы, чтобы это было полностью автоматизировано.
Ответы:
Я делаю именно это, но вам нужно сделать что-то вроде генерации кода, чтобы это работало.
В свое решение я добавил проект «EnumeratedTypes». Это консольное приложение, которое получает все значения из базы данных и строит из них перечисления. Затем он сохраняет все перечисления в сборку.
Код генерации перечисления выглядит так:
Другие мои проекты в решении ссылаются на эту сгенерированную сборку. В результате я могу использовать динамические перечисления в коде вместе с intellisense.
Затем я добавил событие после сборки, чтобы после сборки этого проекта «EnumeratedTypes» он запускался сам и генерировал файл «MyEnums.dll».
Кстати, это помогает изменить порядок сборки вашего проекта так, чтобы сначала создавался EnumeratedTypes. В противном случае, как только вы начнете использовать свою динамически сгенерированную .dll, вы не сможете выполнить сборку, если .dll когда-либо будет удалена. (Проблема типа «курица и яйцо» - другим вашим проектам в решении нужна эта .dll для правильной сборки, и вы не можете создать .dll, пока не создадите свое решение ...)
Я получил большую часть приведенного выше кода из этой статьи msdn .
Надеюсь это поможет!
источник
Перечисления должны быть указаны во время компиляции, вы не можете динамически добавлять перечисления во время выполнения - и почему бы вам не использовать / ссылаться на них в коде?
Из Professional C # 2008:
Итак, я не уверен, что вы можете использовать Enums так, как хотите.
источник
System.Enum
имеет некоторые дополнительные функции). Вместо того, чтобы писатьconst int Red=0, Green=1, Blue=3;
Вы пишитеenum { Red, Green, Blue }
. Константа по определению является постоянной, а не динамической.Это обязательно должно быть реальное перечисление? Как насчет использования
Dictionary<string,int>
вместо этого?например
источник
Я сделал это с помощью шаблона Т4 . Достаточно просто добавить файл .tt в свой проект и настроить Visual Studio для запуска шаблона T4 в качестве этапа перед сборкой.
T4 генерирует файл .cs, что означает, что вы можете просто запросить базу данных и построить перечисление в файле .cs на основе результата. Подключенный как задача перед сборкой, он будет воссоздавать ваше перечисление при каждой сборке, или вместо этого вы можете запустить T4 вручную по мере необходимости.
источник
Допустим, у вас в БД есть следующее:
Создайте select, чтобы получить нужные вам значения:
Создайте исходный код для перечисления, и вы получите что-то вроде:
(очевидно, это построено в виде некоторого цикла.)
Затем начинается самое интересное - компиляция вашего перечисления и его использование:
Теперь у вас есть тип, скомпилированный и готовый к использованию.
Чтобы получить значение перечисления, хранящееся в БД, вы можете использовать:
где значение может быть либо целым числом (0, 1 и т. д.), либо текстом / ключом перечисления (Apple, Banana и т. д.)
источник
Просто покажу ответ Pandincus с кодом "из полки" и некоторыми пояснениями: вам нужны два решения для этого примера (я знаю, что это можно сделать и через одно;), пусть продвинутые студенты представят его ...
Итак, вот DDL SQL для таблицы:
Итак, вот консольная программа, производящая dll:
Вот программа консоли, печатающая вывод (помните, что она должна ссылаться на dll). Пусть продвинутые студенты представят решение для объединения всего в одном решении с динамической загрузкой и проверкой, есть ли уже build dll.
источник
flagFileExists
когда он больше нигде в приложении не используется?Разве мы не пришли к этому не с того направления?
Если данные могут вообще измениться в течение жизненного цикла развернутой версии, тогда перечисление просто не подходит, и вам нужно использовать словарь, хэш или другую динамическую коллекцию.
Если вы знаете, что набор возможных значений фиксирован на время существования развернутой версии, то предпочтительнее перечисление.
Если в вашей базе данных должно быть что-то, что реплицирует перечислимый набор, то почему бы не добавить шаг развертывания для очистки и повторного заполнения таблицы базы данных окончательным набором значений перечисления?
источник
Мне всегда нравится писать свое собственное "нестандартное перечисление". У меня есть один класс, который немного сложнее, но я могу использовать его повторно:
Теперь мне просто нужно создать свое перечисление, которое я хочу использовать:
Наконец-то я могу использовать его так, как хочу:
И мой результат будет:
источник
Вам нужен System.Web.Compilation.BuildProvider
Я также сомневаюсь в целесообразности этого, но тогда, возможно, есть хороший вариант использования, о котором я не могу придумать.
Вы ищете поставщиков сборки, то есть System.Web.Compilation.BuildProvider.
Они очень эффективно используются SubSonic , вы можете скачать исходный код и посмотреть, как они их используют, вам не понадобится ничего наполовину сложнее, чем то, что они делают.
Надеюсь это поможет.
источник
Вы можете использовать CodeSmith для создания чего-то вроде этого:
http://www.csharping.com/PermaLink,guid,cef1b637-7d37-4691-8e49-138cbf1d51e9.aspx
источник
Я не думаю, что есть хороший способ делать то, что вы хотите. И если вы думаете об этом, я не думаю, что это то, чего вы действительно хотите.
Если у вас будет динамическое перечисление, это также означает, что вы должны наполнить его динамическим значением, когда вы на него ссылаетесь. Возможно, с помощью большого количества магии вы могли бы создать своего рода IntelliSense , который позаботится об этом и сгенерирует для вас перечисление в файле DLL. Но примите во внимание объем работы, который потребуется, насколько неэффективным будет доступ к базе данных для получения информации IntelliSense, а также кошмар контроля версий сгенерированного файла DLL.
Если вы действительно не хотите вручную добавлять значения перечисления (вам все равно придется добавить их в базу данных), используйте вместо этого инструмент генерации кода, например шаблоны T4 . Щелкните правой кнопкой мыши + запустить, и вы получите свое перечисление, статически определенное в коде, и вы получите все преимущества использования перечислений.
источник
Использование динамических перечислений - это плохо, независимо от того, каким образом. Вам придется столкнуться с проблемой «дублирования» данных, чтобы обеспечить ясный и простой код, который легко поддерживать в будущем.
Если вы начнете вводить автоматически сгенерированные библиотеки, вы наверняка создадите больше путаницы для будущих разработчиков, которые должны обновить ваш код, чем просто закодировать ваше перечисление в соответствующем объекте класса.
Другие приведенные примеры звучат красиво и захватывающе, но подумайте о накладных расходах на сопровождение кода по сравнению с тем, что вы от этого получите. Кроме того, будут ли эти ценности меняться так часто?
источник
Один из способов сохранить перечисления и в то же время создать динамический список значений - использовать перечисления, которые у вас есть в настоящее время, с динамически созданным словарем.
Поскольку большинство перечислений используются в контексте, в котором они определены для использования, а «динамические перечисления» будут поддерживаться динамическими процессами, вы можете различить 2.
Первым шагом является создание таблицы / коллекции, содержащей идентификаторы и ссылки для динамических записей. В таблице вы получите автоинкремент намного больше, чем ваше самое большое значение Enum.
Теперь переходим к вашим динамическим перечислениям. Я предполагаю, что вы будете использовать перечисления для создания набора условий, которые применяют набор правил, некоторые из которых генерируются динамически.
источник
класс строителя перечисления
создать объект
источник