Jak automatycznie utworzyć wyliczenie, a następnie użyć jego wartości w języku C # na podstawie wartości w tabeli wyszukiwania bazy danych (przy użyciu warstwy danych biblioteki przedsiębiorstwa)?
Na przykład, jeśli dodam nową wartość wyszukiwania w bazie danych, nie chcę ręcznie dodawać dodatkowej deklaracji statycznej wartości wyliczenia w kodzie - chciałbym, aby wyliczenie było zsynchronizowane z bazą danych.
Czy istnieje coś takiego?
Nie chcę tworzyć statycznego wyliczenia generowanego przez kod (zgodnie z artykułem w The Code Project Generator kodu wyliczenia - automatyczne generowanie kodu wyliczenia z tabel wyszukiwania w bazie danych ) i wolę, aby było to całkowicie automatyczne.
Odpowiedzi:
Robię dokładnie to, ale aby to zadziałało , musisz wykonać jakiś rodzaj generowania kodu.
W moim rozwiązaniu dodałem projekt „EnumeratedTypes”. Jest to aplikacja konsolowa, która pobiera wszystkie wartości z bazy danych i konstruuje z nich wyliczenia. Następnie zapisuje wszystkie wyliczenia w zestawie.
Kod generowania wyliczenia wygląda następująco:
Moje inne projekty w rozwiązaniu odwołują się do tego wygenerowanego zestawu. W rezultacie mogę następnie używać dynamicznych wyliczeń w kodzie, wraz z inteligencją.
Następnie dodałem zdarzenie po kompilacji, aby po zbudowaniu tego projektu „EnumeratedTypes” uruchamiał się sam i generował plik „MyEnums.dll”.
Nawiasem mówiąc, warto zmienić kolejność kompilacji projektu, tak aby „EnumeratedTypes” było budowane jako pierwsze. W przeciwnym razie, gdy zaczniesz używać dynamicznie generowanego pliku .dll, nie będziesz mógł wykonać kompilacji, jeśli plik .dll zostanie kiedykolwiek usunięty. (Problem w rodzaju kurczaka i jajka - inne projekty w rozwiązaniu wymagają tego pliku .dll do poprawnego skompilowania i nie możesz utworzyć pliku .dll, dopóki nie utworzysz rozwiązania ...)
Większość powyższego kodu uzyskałem z tego artykułu MSDN .
Mam nadzieję że to pomoże!
źródło
Wyliczenia muszą być określone w czasie kompilacji, nie można dynamicznie dodawać wyliczeń w czasie wykonywania - i dlaczego miałbyś nie używać / odwoływać się do nich w kodzie?
Od Professional C # 2008:
Nie jestem więc pewien, czy możesz używać wyliczeń tak, jak chcesz.
źródło
System.Enum
ma jakąś dodatkową funkcjonalność). Zamiast pisać,const int Red=0, Green=1, Blue=3;
piszeszenum { Red, Green, Blue }
. Stała jest z definicji stała, a nie dynamiczna.Czy to musi być rzeczywiste wyliczenie? Co powiesz na użycie
Dictionary<string,int>
zamiast tego?na przykład
źródło
Zrobiłem to za pomocą szablonu T4 . Upuszczenie pliku .tt do projektu i skonfigurowanie programu Visual Studio do uruchamiania szablonu T4 jako kroku przed kompilacją jest dość trywialne.
T4 generuje plik .cs, co oznacza, że możesz po prostu wysłać zapytanie do bazy danych i zbudować wyliczenie w pliku .cs na podstawie wyniku. Połączone jako zadanie przed kompilacją, utworzy ponownie wyliczenie przy każdej kompilacji lub możesz zamiast tego uruchomić T4 ręcznie w razie potrzeby.
źródło
Powiedzmy, że masz w swojej bazie danych:
Skonstruuj selekcję, aby uzyskać potrzebne wartości:
Skonstruuj kod źródłowy wyliczenia, a otrzymasz coś takiego:
(oczywiście jest to zbudowane w jakiejś pętli).
Potem przychodzi zabawna część, kompilowanie wyliczenia i używanie go:
Teraz masz skompilowany typ i gotowy do użycia.
Aby uzyskać wartość wyliczenia przechowywaną w bazie danych, możesz użyć:
gdzie wartość może być liczbą całkowitą (0, 1 itd.) lub wyliczonym tekstem / kluczem (Apple, Banana itp.)
źródło
Po prostu pokazuję odpowiedź Pandincusa z kodem "z półki" i kilka wyjaśnień: Potrzebujesz dwóch rozwiązań dla tego przykładu (wiem, że można to zrobić również za pomocą jednego;), pozwól zaawansowanym uczniom to przedstawić ...
Oto więc DDL SQL dla tabeli:
Oto program konsoli, który tworzy bibliotekę dll:
Oto programowanie konsoli wypisujące dane wyjściowe (pamiętaj, że musi odwoływać się do biblioteki dll). Niech zaawansowani studenci przedstawią rozwiązanie łączące wszystko w jednym rozwiązaniu z dynamicznym ładowaniem i sprawdzaniem, czy jest już skompilowana biblioteka dll.
źródło
flagFileExists
skoro nie jest używany nigdzie indziej w aplikacji?Czy nie idziemy do tego z niewłaściwego kierunku?
Jeśli dane prawdopodobnie w ogóle ulegną zmianie w okresie istnienia wdrożonej wersji, wyliczenie jest po prostu nieodpowiednie i musisz użyć słownika, skrótu lub innej kolekcji dynamicznej.
Jeśli wiesz, że zestaw możliwych wartości jest ustalony przez cały okres istnienia wdrożonej wersji, preferowane jest wyliczenie.
Jeśli w bazie danych musi znajdować się coś, co replikuje wyliczony zestaw, to dlaczego nie dodać kroku wdrażania, aby wyczyścić i ponownie wypełnić tabelę bazy danych ostatecznym zestawem wartości wyliczeniowych?
źródło
Zawsze lubię pisać własne „niestandardowe wyliczenie”. Niż mam jedną klasę, która jest trochę bardziej złożona, ale mogę jej użyć ponownie:
Teraz muszę tylko utworzyć wyliczenie, którego chcę użyć:
W końcu mogę go używać tak, jak chcę:
A moje wyjście to:
źródło
Chcesz System.Web.Compilation.BuildProvider
Wątpię też w sens robienia tego, ale może jest dobry przypadek użycia, o którym nie mogę myśleć.
To, czego szukasz, to Build Providers, czyli System.Web.Compilation.BuildProvider
Są bardzo efektywnie używane przez SubSonic , możesz pobrać źródła i zobaczyć, jak ich używają, nie będziesz potrzebować niczego w połowie tak skomplikowanego, jak to, co robią.
Mam nadzieję że to pomoże.
źródło
Możesz użyć CodeSmith do wygenerowania czegoś takiego:
http://www.csharping.com/PermaLink,guid,cef1b637-7d37-4691-8e49-138cbf1d51e9.aspx
źródło
Myślę, że nie ma dobrego sposobu robienia tego, co chcesz. A jeśli o tym pomyślisz, nie sądzę, że tego naprawdę chcesz.
Jeśli chcesz mieć dynamiczne wyliczenie, oznacza to również, że musisz podać do niego wartość dynamiczną, gdy odwołujesz się do niego. Może z dużą ilością magii można uzyskać coś w rodzaju IntelliSense , który zajmie się tym i wygeneruje dla Ciebie wyliczenie w pliku DLL. Ale weź pod uwagę ilość pracy, która by to wymagała, jak nieskuteczny byłby dostęp do bazy danych w celu pobrania informacji IntelliSense, a także koszmar wersji kontrolującej wygenerowany plik DLL.
Jeśli naprawdę nie chcesz ręcznie dodawać wartości wyliczenia (i tak będziesz musiał dodać je do bazy danych) użyj zamiast tego narzędzia do generowania kodu, na przykład szablonów T4 . Kliknij prawym przyciskiem myszy i uruchom, a otrzymasz wyliczenie zdefiniowane statycznie w kodzie i uzyskasz wszystkie korzyści płynące z używania wyliczeń.
źródło
Używanie dynamicznych wyliczeń jest złe bez względu na sposób. Będziesz musiał uporać się z problemem „powielania” danych, aby zapewnić przejrzysty i łatwy kod, który będzie łatwy do utrzymania w przyszłości.
Jeśli zaczniesz wprowadzać automatycznie generowane biblioteki, z pewnością wprowadzisz więcej zamieszania wśród przyszłych programistów, którzy muszą zaktualizować swój kod, niż po prostu zakodować wyliczenie w odpowiednim obiekcie klasy.
Inne podane przykłady brzmią przyjemnie i ekscytująco, ale zastanów się nad narzutem związanym z utrzymaniem kodu w porównaniu z tym, co z niego otrzymasz. Czy te wartości będą się tak często zmieniać?
źródło
Jednym ze sposobów zachowania wyliczeń i jednoczesnego tworzenia dynamicznej listy wartości jest użycie aktualnie posiadanych wyliczeń z dynamicznie tworzonym słownikiem.
Ponieważ większość wyliczeń jest używana w kontekście, w jakim zostały zdefiniowane, a „dynamiczne wyliczenia” będą obsługiwane przez procesy dynamiczne, można wyróżnić 2.
Pierwszym krokiem jest utworzenie tabeli / kolekcji, w której znajdują się identyfikatory i referencje dla wpisów dynamicznych. W tabeli automatycznie zwiększasz wartość znacznie większą niż twoja największa wartość Enum.
Teraz pora na Twoje dynamiczne wyliczenia. Zakładam, że będziesz używać wyliczeń do tworzenia zestawu warunków, które stosują zestaw reguł, niektóre są generowane dynamicznie.
źródło
Klasa konstruktora wyliczeń
stworzyć obiekt
źródło