2009-04-02 2 views
1

私は可能な値を列挙型を持っている:ジェネリックはこのクラスデザインのソリューションですか?

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

今、私は私のクラスは、それが列挙型のリストに基づいて、複数の値の要求を満たすことができるという意味でダイナミックになりたいです。したがって、列挙型リストが増えれば、すべての可能な値を取得できます。

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

しかし、私は、列挙型のリスト(または任意のリスト)が大きくなった場合に再コンパイルする必要がdoesntが何かをしたい:ここ

は私の最初の設計がどのように見えるかだ

public class Locale 
    { 
     public string StringValue<T> Where T : Language 
    }  
:それはのようなものを表現することができます

私は、この問題にうまく対処できる提案やデザインパターンを公開しています。 ありがとう

答えて

1

辞書を使用してください。何をするにしても

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

あなたが列挙型を変更した場合、あなたは再コンパイルする必要がありますが、どのようなあなたはおそらく意味はLocaleクラス「を維持」です。

+0

私は、維持すると言っています:p –

0

残念なことに、あなたが提案しているものはうまくいきません。

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

汎用パラメータは、型パラメータではなく、値パラメータ、及び(少なくともC#で)列挙メンバーは異なる値ではなく、タイプされている:これは、より良好な設計私見であろう。列挙型(この場合、Language)は実際には型ですが、そのメンバはありません。

また、ジェネリッククラスはLanguageから継承された型パラメータを持っていることを知っていますが、C#ではenumsが継承できないため、thisとジェネリック型パラメータの制約( "where T:Langauge"共通の型パラメータがすべての場合に常に「言語」になるため、この場合汎用クラスを持つポイントはありません。私があなただったら、私はこれを行うだろう:

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

多分それはクラスになると可能System.Globalization.CultureInfoと同じように、言語固有の処理の一部をincapsulateする言語のために良いでしょうか?

0

他の回答にも同意することができますが、言語リスト用の辞書を使用して、実行時にローカル設定またはデータベースのいずれかから移入して再コンパイルする必要なく拡張性を提供できます。

関連する問題