Ich habe eine Reihe von Aufzählungswerten (genauer gesagt, Fehlercodes). Der Code ist eine 16-Bit-Ganzzahl ohne Vorzeichen. Ich suche nach einer Datenstruktur, die eine solche Aufzählung darstellen könnte. Eine ähnliche Frage wurde hier gestellt: Was ist das beste C # -Muster für die Implementierung einer Hierarchie mit einer Enumeration? . Aber diese Hierarchie ist tiefer.
Beispielaufzählungswerte
Anwendungsfall
Wenn der Benutzer einen Code bereitstellt, muss die Benutzeroberfläche die entsprechende Bedeutung des Codes mit der Hierarchie anzeigen.
Wenn der Benutzer beispielsweise den Wert 0x2121
angibt, muss die Benutzeroberfläche Short to earth in phase 1 in the current at device input side
anzeigen. Der beste Weg, dies darzustellen, ist eine hierarchische Notation: Current : DeviceInputSide : ShortToEarth : ShortToEarthInPhase1
.
Konkurrierende Ansätze
Ich habe drei konkurrierende Ansätze, um die Aufzählung darzustellen:
Ansatz 1
Die Aufzählungen:
Der Controller:
%Vor%
Ansatz 2
Das XML zum Speichern der Aufzählungswerte sieht folgendermaßen aus
Ansatz 3
Das XML zum Speichern der Enumerationswerte ist das gleiche wie in Approach 2. Das Wörterbuch wird von xml
by GetChildren()
ausgefüllt.
Die Bedeutungen werden mit GetHierarchicalMeaning()
:
Die Klasse WarnCodeValue
:
Fragen
Gefunden, dass eine modifizierte Version von Ansatz 3 am besten geeignet ist. Danke an @paolo , dass er mir geholfen hat, die Antwort zu finden.
Modifizierter Ansatz 3
Das xml
enthält die Codes:
Die Klasse WarnCodeValue
:
Die Prozessorklasse singleton
(um die Bedeutung eines Codes abzurufen):
Verwendung
Ausgabe
Current : Current, Device Input side : Short to Earth : Short to earth in Phase L1
Mögliche Modifikationen enthalten GetMeaning(code)
, um die ursprüngliche Bedeutung des Codes und nicht die verkettete Bedeutung zu erhalten.
Wenn Sie Klassen anstelle von enums verwenden, verwenden Sie für jeden Wert einen Singleton und können mit dem Typsystem eine Struktur erstellen, einschließlich virtueller Methoden, um Fehler txt usw. zu erzeugen. (Dies kann manchmal eine gute Option , kann aber auch zu vielen Problemen führen, wenn es nicht gut passt)
Sie können FlagsAttribute verwenden. Zum Beispiel könnten Sie so etwas tun:
%Vor%Sie können es so testen:
%Vor%Zweiter Versuch ... Sie könnten Ihre eigene Baumstruktur implementieren, wobei jeder Knoten eine einstellige hexadezimale Darstellung hat und ein Code wie 0x2121 eine Verzweigung des Baumes darstellt:
%Vor%Also, um zu lesen, was 0x2121 bedeutet, folgen wir dem entsprechenden Zweig des Baumes und (für jeden Knoten) lesen wir die Nachricht, die es enthält.
Hier ist eine schnelle und schmutzige Implementierung des Baumes:
%Vor%Sie können den Baum auf diese Weise füllen:
%Vor%Auf diese Weise erhalten Sie vollständige Kontrolle über die hierarchische Struktur Ihrer Codes und können Prüfungen implementieren, so dass die Struktur selbst nicht beschädigt werden kann. Das Durchsuchen einer Nachricht bleibt einfach und (da ein Code nach der ersten 0 nicht verarbeitet wird) sollte eine Suche nach 0x2000 effizienter sein, da nur die 2 tatsächlich verarbeitet wird.
%Vor%Tags und Links .net c# enumeration