2009-04-02 3 views
1

Ich habe eine Enumeration mit den möglichen Werten bekam:Ist Generika die Lösung für dieses Klassen-Design?

public enum Language 
    { 
     English = 1, 
     French = 2, 
     German = 3 
    } 

Jetzt ist meine Klasse möchte ich im Sinne dynamisch sein, dass es für mehrere Werte auf der Basis der Aufzählungsliste gerecht zu werden. Wenn also die Enum-Liste wächst, kann ich alle möglichen Werte erfassen.

Hier ist, wie mein anfängliches Design sieht:

public class Locale 
    { 
     public string EnglishValue { get; set; } 
     public string FrenchValue { get; set; } 
     public string GermanValue { get; set; } 
    } 

Aber ich will etwas, das muß neu kompiliert werden tut, wenn die ENUM-Liste (oder eine Liste) wächst: Ist es möglich, so etwas wie auszudrücken:

public class Locale 
    { 
     public string StringValue<T> Where T : Language 
    }  

Ich bin offen für alle Vorschläge oder Design-Muster, die gut mit diesem Problem umgehen können. Danke

Antwort

1

Verwenden Sie einfach ein Wörterbuch.

public class Locale : Dictionary<Language, string> 
{ 
} 

Was auch immer Sie tun, wenn Sie die Enum ändern, müssen Sie neu kompilieren, aber was Sie wahrscheinlich bedeuten, ist „halten“, um die Locale-Klasse.

+0

richtig, ich meine zu behaupten: p –

0

Was Sie vorschlagen, wird leider nicht funktionieren. Dies wäre ein besseres Design IMHO sein:

public class Locale 
{ 
    public string GetStringValue(Language language) 
    { 
     // return value as appropriate 
    } 
} 
0

Allgemeine Parameter sind Typ-Parameter, nicht Wertparameter und Aufzählungselemente (zumindest in C#) sind verschiedene Werte, nicht-Typen. Das enum (in diesem Fall Sprache) ist in der Tat ein Typ, aber nicht seine Mitglieder.

Auch die generische Klasse wird wissen, dass es einen Typparameter hat, der von Language geerbt wird, aber da Enums nicht in C# vererbbar sind, this und der generische Typparameter constraint (das "where T: Langauge" -Ding) zusammen bedeutet ziemlich viel, dass der generische Typparameter in allen Fällen immer "Sprache" ist, also hat es in diesem Fall keinen Sinn, eine generische Klasse zu haben. Wenn ich Sie wäre, würde ich dies tun:

public class Locale 
{ 
    public string GetStringValue(Language language) 
    { 
     // ... 
    } 
} 
0

Vielleicht ist es besser für Sprache, eine Klasse zu sein und einige der sprachspezifischen Verarbeitung incapsulate wie System.Globalization.CultureInfo tut?

0

Während ich mit den anderen Antworten einverstanden bin, könnte man natürlich ein Dictionary für die Language-Liste verwenden, dann zur Laufzeit entweder aus einer lokalen Konfiguration oder Datenbank auffüllen, ohne die Notwendigkeit einer Neukompilierung.

Verwandte Themen