Wie erstelle ich automatisch eine Aufzählung und verwende anschließend ihre Werte in C # basierend auf Werten in einer Datenbank-Nachschlagetabelle (unter Verwendung der Datenschicht der Unternehmensbibliothek)?
Wenn ich beispielsweise einen neuen Suchwert in die Datenbank einfüge, möchte ich die zusätzliche statische Aufzählungswertdeklaration nicht manuell im Code hinzufügen müssen. Ich möchte die Aufzählung mit der Datenbank synchron halten.
Gibt es so etwas?
Ich möchte nicht einen Code erzeugte statische Enum (per erstellen The Code Project Artikel Enum - Code - Generator - Generieren von ENUM - Code automatisch aus der Datenbank Nachschlagetabellen ) und würde es vorziehen , sie vollautomatisch zu sein.
Antworten:
Ich mache genau das, aber Sie müssen eine Art Codegenerierung durchführen, damit dies funktioniert.
In meiner Lösung habe ich ein Projekt "EnumeratedTypes" hinzugefügt. Dies ist eine Konsolenanwendung, die alle Werte aus der Datenbank abruft und die Aufzählungen daraus erstellt. Anschließend werden alle Aufzählungen in einer Assembly gespeichert.
Der Enum-Generierungscode lautet wie folgt:
Meine anderen Projekte in der Lösung verweisen auf diese generierte Baugruppe. Infolgedessen kann ich dann die dynamischen Aufzählungen im Code zusammen mit Intellisense verwenden.
Dann habe ich ein Post-Build-Ereignis hinzugefügt, damit dieses "EnumeratedTypes" -Projekt nach dem Erstellen selbst ausgeführt wird und die Datei "MyEnums.dll" generiert.
Übrigens ist es hilfreich, die Erstellungsreihenfolge Ihres Projekts so zu ändern , dass zuerst "EnumeratedTypes" erstellt wird. Andernfalls können Sie, sobald Sie Ihre dynamisch generierte DLL verwenden, keinen Build mehr erstellen, wenn die DLL jemals gelöscht wird. (Henne-Ei-Problem - Ihre anderen Projekte in der Lösung benötigen diese DLL, um ordnungsgemäß zu erstellen, und Sie können die DLL erst erstellen, wenn Sie Ihre Lösung erstellt haben ...)
Ich habe den größten Teil des obigen Codes aus diesem MSDN-Artikel erhalten .
Hoffe das hilft!
quelle
Aufzählungen müssen zur Kompilierungszeit angegeben werden, Sie können zur Laufzeit keine Aufzählungen dynamisch hinzufügen - und warum sollten Sie, es würde keine Verwendung / Referenz im Code geben?
Aus Professional C # 2008:
Ich bin mir also nicht sicher, ob Sie Enums so verwenden können, wie Sie es möchten.
quelle
System.Enum
über zusätzliche Funktionen verfügt). Anstatt zu schreibenconst int Red=0, Green=1, Blue=3;
, schreibst duenum { Red, Green, Blue }
. Eine Konstante ist per Definition konstant und nicht dynamisch.Muss es eine tatsächliche Aufzählung sein? Wie wäre es
Dictionary<string,int>
stattdessen mit einem ?beispielsweise
quelle
Ich habe dies mit einer T4- Vorlage gemacht. Es ist ziemlich trivial, eine .tt-Datei in Ihr Projekt einzufügen und Visual Studio so einzurichten, dass die T4-Vorlage als Vorerstellungsschritt ausgeführt wird.
Der T4 generiert eine CS-Datei. Dies bedeutet, dass Sie einfach die Datenbank abfragen und aus dem Ergebnis eine Aufzählung in einer CS-Datei erstellen können. Als Pre-Build-Aufgabe verkabelt, wird Ihre Enumeration bei jedem Build neu erstellt, oder Sie können den T4 stattdessen nach Bedarf manuell ausführen.
quelle
Angenommen, Sie haben Folgendes in Ihrer Datenbank:
Erstellen Sie eine Auswahl, um die benötigten Werte zu erhalten:
Wenn Sie den Quellcode für die Aufzählung erstellen, erhalten Sie Folgendes:
(Offensichtlich ist dies in einer Art Schleife aufgebaut.)
Dann kommt der lustige Teil: Kompilieren Sie Ihre Aufzählung und verwenden Sie sie:
Jetzt haben Sie den Typ kompiliert und sind einsatzbereit.
Um einen in der DB gespeicherten Aufzählungswert abzurufen, können Sie Folgendes verwenden:
Dabei kann der Wert entweder der ganzzahlige Wert (0, 1 usw.) oder der Aufzählungstext / -schlüssel (Apple, Banana usw.) sein.
quelle
Ich zeige nur die Antwort von Pandincus mit dem Code "of the Shelf" und einer Erklärung: Sie benötigen zwei Lösungen für dieses Beispiel (ich weiß, dass dies auch über eine möglich ist;). Lassen Sie die fortgeschrittenen Schüler sie präsentieren ...
Hier ist also das DDL-SQL für die Tabelle:
Hier ist also das Konsolenprogramm, das die DLL produziert:
Hier ist die Konsolenprogrammierung, die die Ausgabe druckt (denken Sie daran, dass sie auf die DLL verweisen muss). Lassen Sie die fortgeschrittenen Schüler die Lösung vorstellen, um alles in einer Lösung mit dynamischem Laden zu kombinieren und zu überprüfen, ob bereits eine Build-DLL vorhanden ist.
quelle
flagFileExists
wenn es nirgendwo anders in der Anwendung verwendet wird?Kommen wir nicht aus der falschen Richtung dazu?
Wenn sich die Daten während der Lebensdauer der bereitgestellten Version wahrscheinlich überhaupt ändern, ist eine Aufzählung einfach nicht geeignet, und Sie müssen ein Wörterbuch, einen Hash oder eine andere dynamische Sammlung verwenden.
Wenn Sie wissen, dass der Satz möglicher Werte für die Lebensdauer der bereitgestellten Version festgelegt ist, ist eine Aufzählung vorzuziehen.
Wenn Ihre Datenbank etwas enthalten muss , das den aufgezählten Satz repliziert, können Sie einen Bereitstellungsschritt hinzufügen, um die Datenbanktabelle mit dem endgültigen Satz von Aufzählungswerten zu löschen und neu zu füllen.
quelle
Ich schreibe immer gerne meine eigene "benutzerdefinierte Aufzählung". Dann habe ich eine Klasse, die etwas komplexer ist, aber ich kann sie wiederverwenden:
Jetzt muss ich nur noch meine Aufzählung erstellen, die ich verwenden möchte:
Endlich kann ich es benutzen, wie ich will:
Und meine Ausgabe wäre:
quelle
Sie möchten System.Web.Compilation.BuildProvider
Ich bezweifle auch die Weisheit, dies zu tun, aber dann gibt es vielleicht einen guten Anwendungsfall, an den ich nicht denken kann.
Was Sie suchen, sind Build-Anbieter, dh System.Web.Compilation.BuildProvider
Sie werden von SubSonic sehr effektiv verwendet . Sie können die Quelle herunterladen und sehen, wie sie verwendet werden. Sie benötigen nichts, was halb so kompliziert ist wie das, was sie tun.
Hoffe das hilft.
quelle
Sie können CodeSmith verwenden, um Folgendes zu generieren:
http://www.csharping.com/PermaLink,guid,cef1b637-7d37-4691-8e49-138cbf1d51e9.aspx
quelle
Ich glaube nicht, dass es eine gute Möglichkeit gibt, das zu tun, was Sie wollen. Und wenn Sie darüber nachdenken, denke ich nicht, dass Sie das wirklich wollen.
Wenn Sie eine dynamische Aufzählung haben würden, bedeutet dies auch, dass Sie sie mit einem dynamischen Wert füttern müssen, wenn Sie darauf verweisen. Vielleicht könnten Sie mit viel Magie eine Art IntelliSense erreichen , das sich darum kümmert und eine Aufzählung für Sie in einer DLL-Datei generiert. Bedenken Sie jedoch, wie viel Arbeit erforderlich wäre, wie unwirksam es wäre, auf die Datenbank zuzugreifen, um IntelliSense-Informationen abzurufen, sowie den Albtraum der Versionskontrolle der generierten DLL-Datei.
Wenn Sie die Aufzählungswerte wirklich nicht manuell hinzufügen möchten (Sie müssen sie trotzdem zur Datenbank hinzufügen), verwenden Sie stattdessen ein Tool zur Codegenerierung, z. B. T4- Vorlagen. Klicken Sie mit der rechten Maustaste + Ausführen, und Sie haben Ihre Aufzählung statisch im Code definiert. Sie erhalten alle Vorteile der Verwendung von Aufzählungen.
quelle
Die Verwendung dynamischer Aufzählungen ist auf jeden Fall schlecht. Sie müssen sich die Mühe machen, die Daten zu "duplizieren", um einen klaren und einfachen Code zu gewährleisten, der in Zukunft leicht zu pflegen ist.
Wenn Sie mit der Einführung automatisch generierter Bibliotheken beginnen, werden zukünftige Entwickler mit Sicherheit mehr Verwirrung stiften, wenn sie Ihren Code aktualisieren müssen, als wenn Sie einfach Ihre Aufzählung im entsprechenden Klassenobjekt codieren.
Die anderen Beispiele klingen nett und aufregend, aber denken Sie an den Aufwand für die Code-Wartung im Vergleich zu dem, was Sie daraus erhalten. Werden sich diese Werte auch so häufig ändern?
quelle
Eine Möglichkeit, die Aufzählungen beizubehalten und gleichzeitig eine dynamische Werteliste zu erstellen, besteht darin, die Aufzählungen zu verwenden, die Sie derzeit mit einem dynamisch erstellten Wörterbuch haben.
Da die meisten Aufzählungen in dem Kontext verwendet werden, für den sie definiert sind, und die "dynamischen Aufzählungen" von dynamischen Prozessen unterstützt werden, können Sie die 2 unterscheiden.
Der erste Schritt besteht darin, eine Tabelle / Sammlung zu erstellen, die die IDs und Referenzen für die dynamischen Einträge enthält. In der Tabelle werden Sie automatisch größer als Ihr größter Enum-Wert.
Nun kommt der Teil für Ihre dynamischen Aufzählungen. Ich gehe davon aus, dass Sie die Aufzählungen verwenden, um eine Reihe von Bedingungen zu erstellen, die eine Reihe von Regeln anwenden. Einige werden dynamisch generiert.
quelle
Enum Builder Klasse
ein Objekt erstellen
quelle