2016-06-14 6 views
0

Ich habe einige Enum Flags, die eine Version eines externen Systems darstellen. Ich möchte sicherstellen, dass jedes Mal, wenn das externe System seine Version aktualisiert, meine Funktionalität in der Lage sein sollte, es zu unterstützen (ich werde im Voraus wissen, dass die Version aktualisiert wird, also ist es eine proaktive Aktion). Auch meine Kommunikation muss mit diesem System in beide Richtungen erfolgen, dh interne und externe Kommunikation kann unterschiedliche Versionssätze haben.Enum Flags Konvertierungen für Dezimalwerte/Namen

Ich habe ein enum-Flag erstellt, um diese Versionen darzustellen.

[Flags] 
public enum ExternalSystemVersionEnum 
{ 
    System1 = 1, 
    System2 = 2, 
    System3 = 4, 
    All = 7 
} 

Dies funktioniert in Ordnung für eine formale größere Upgrades. Leider kann ich diese nicht als System1.0 oder so nennen. Als Dezimalzahlen kann ich auch keinen generischen Enum-Parser verwenden.

(T) Enum.Parse(typeof (T), Convert.ToString(enumValue)); 

Natürlich habe ich immer noch die oben stattdessen durch Verwendung Schalter/if-Anweisungen erreichen kann, aber ich möchte wirklich überhaupt keine harte Kodierung vermeiden (auch Ressourcen/Inhalte auch wenn ich kann), als ein Die Version des externen Systems kann komplett verworfen werden, und ich möchte nicht daran interessiert sein, alle Strings zu verfolgen.

Auch ich brauche Flags oder gleichwertige Funktionalität, wie ich noch die Kommunikation empfangen kann, die keine Systemversion Identification hat, die standardmäßig zu für alle Versionen geht. Eine andere Kommunikation kann nur auf einige ausgewählte Versionen, z. nur für 2.0 weiter usw.

Bitte beachten Sie, dass ich dies leicht mit Switch/If erreichen kann, aber ich möchte keine harte Codierung haben, es sei denn, es gibt keine andere (einfache) Möglichkeit. Mein Hauptanliegen hier ist eine Funktionalität, die wirkt wie Flags, kann aber leicht identifiziert Werte mit Dezimalstellen, sagen 1.0 oder 1.2 oder 1.3.1 für diese Angelegenheit (obwohl in der Geschichte hatten sie nie doppelte Dezimalstellen) und bietet Kompilierzeit Fehler. Ich bin offen für Vorschläge anderer Mechanismen, aber ich würde wirklich bevorzugen, dass es eine einfache Logik ist, da es ein sehr trivialer Teil des gesamten Prozesses ist.

+1

Was statische Klasse? 'public static class ExternalSystemVersionEnum { öffentliches statisches Doppel System1 = 1.0; public static double System2 = 2.0; öffentliches statisches Doppel System3 = 4.0; öffentliche statische Doppel Alle = 7; } ' –

+0

Ich bin nicht sicher, ob es die Funktionalität der HasFlag-Prüfung entspricht. Nicht, dass es sehr komplex zu bauen ist, aber vermeidet unnötigen Code und reduziert die Wartung. Könnten Sie bitte noch etwas weiter erklären, da ich es vielleicht nicht richtig verstanden habe? – touchofevil

Antwort

2

Was

[Flags] 
public enum ExternalSystemVersionEnum 
{ 
    System1_1 = 1, 
    System2_1 = 2, 
    System3_2 = 4, 
    All = 7 
} 

var enumString = decimalValue.ToString("0.0", 
    CultureInfo.InvarantCulture).Replace('.', "_"); 

var enumValue = (ExternalSystemVersionEnum)Enum.Parse(
    typeof(ExternalSystemVersionEnum), enumString); 
+0

Macht viel Sinn. Es ist eine generische Logik, die die Anforderungen perfekt integriert. :) – touchofevil

1

Es klingt, als könnten sich diese Werte ändern, je nachdem, welche Systeme angeschlossen sind und ob die angeschlossenen Systeme aktualisiert werden. Um die Hardcodierung zu entfernen und flexibler zu gestalten, würde ich vorschlagen, Ihre Daten als benutzerdefinierten Abschnitt in einer app.config-Datei hinzuzufügen. Auf diese Weise können Sie die Werte leicht ändern/hinzufügen/entfernen, ohne jedes Mal neu kompilieren zu müssen, wenn sich etwas ändert.

<configSections> 
    <section name="SystemVersions" type="YourAppName.SystemVersionSection, YourAppName" /> 
</configSections> 

<SystemVersions> 
    <system version="1.0" /> 
    <system version="2.0" /> 
    <system version="1.3.1" /> 
    <system version="All" /> 
</SystemVersions> 

Diese CodeProject Seite Custom Configuration Sections for Lazy Coders kann Ihnen helfen.

Ich verstehe, dass dies nicht ganz Ihren Anforderungen der Verwendung eines Enum entspricht, aber manchmal wird ein alternatives Design insgesamt besser passen.

+0

Vielen Dank für die Antwort. Aber ich fürchte, für dieses spezielle Szenario kann ich den Vorschlag nicht verwenden. Up Abstimmung für diesen Link, obwohl es informativ war. – touchofevil