2009-12-05 7 views
47

可能性の重複:
Enum with stringsc#:列挙定数の格納にenumを使用するには?

さは、それがそうするための最良の方法は何かそうでない場合は

 enum{name1="hmmm" name2="bdidwe"} 

のように列挙型に文字列定数を持つことが可能でしょうか?

私はあなたのoperationクラスはそのままコンパイルされません...あなたが宣言していない、そのように文字列のために働いていない今、私は

 class operation 
     { 
      public const string name1="hmmm"; 
      public const string name2="bdidwe" 
     } 
+0

正確な複製http://stackoverflow.com/questions/630803/enum-with-strings –

+0

string []日= {"یکشنبه"、 "دوشنبه"、 "سهشنبه"、 "چهارشنبه"、 "پنجشنبه"、 " جمعه "、"شنبه "、}; int i =(int)obj.GetDayOfWeek(dt); 文字列DayName = Days [i]; –

答えて

92

enum定数は、順序型(デフォルトではint)のものとすることができます。

私は "文字列ベースの列挙型"のようなものを必要とするときは、あなたが望むような定数を保持するクラスを作成します。ただし、不要なインスタンス化と不要なサブクラス化を防ぐ静的クラスにします。

しかし、あなたは、メソッドのシグネチャに型として文字列を使用しないと、あなたはより安全、より限定的なタイプ(のようなOperation)を好む場合は、安全な列挙パターンを使用することができます。

public sealed class Operation 
{ 
    public static readonly Operation Name1 = new Operation("Name1"); 
    public static readonly Operation Name2 = new Operation("Name2"); 

    private Operation(string value) 
    { 
     Value = value; 
    } 

    public string Value { get; private set; } 
} 
+1

これは本当に素晴らしいようです.thanks –

+17

+1完璧にフィットします。暗黙的な操作に加えて、あなたは金色です: 'public static暗黙の演算子文字列(操作op){戻り値op.Value; } '強く型付けされたパラメータとして、または文字列として使うことができるからです。 –

+0

しかし、上記のパターンを文字列定数が必要な場所で使用することはできません。たとえば、switch..caseステートメントの場合 – ghd

0

のように一つのクラスに関連するすべてのconstnatsをグループ化しています、それを試してみました名前1と名前2のタイプ...

しかし、それは私が取る方法です...はい。

あなたはそれのstruct作る場合、それは、列挙型の全体のポイントは、序数の定数になることです

+0

ここでは忘れてしまいました。そうでなければ、fine.iは文字列定数を保持する正しい方法を心配しています。 –

+0

はい、私はあまりにもおそらくそれらの行に沿って何かします。 –

4

...またはあなたが望んであってもなくてもよい値の型になります。
ただし、拡張メソッドを使用して、あなたが望むものを達成することができます:あなたはDescriptionAttributeを使用してこれを行うことが

enum Operation 
    { 
     name1, 
     name2 
    } 

    static class OperationTextExtender 
    { 
     public static String AsText(this Operation operation) 
     { 
       switch(operation) 
       { 
        case Operation.name1: return "hmmm"; 
        case Operation.name2: return "bdidwe"; 
        ... 
       } 
     } 
    } 

    ... 
    var test1 = Operation.name1; 
    var test2 = test1.AsText(); 
+0

現実世界のコードでこのような一度限りの拡張メソッドを使用するかどうか、本当に不思議ですか? (その質問には風刺は意図されていない)。これができることを知ることは面白いです。 – BillW

+0

私はフラグenumのContainsとRemoveメソッドで拡張クラスを作成するスニペットを持っています。私はそれを公開APIの一部にしたくないので、内部的なものです。しかし、私はそれをかなり頻繁に使用し、組み込みフラグ、特に "Contains"にも使用します。 –

+0

@RobertGieseckeちょうどあなたにこの解決策の名誉を与えたかったのです。拡張メソッドは私にこれを行うための完璧でエレガントな方法でした!他の解決策は列挙型を避けることでしたが、このソリューションでは拡張が可能でした。ほとんどのソリューションが行ったように、タスクを複雑にすることなく外に出ることなく完璧に機能しました。 – Mike

36

が、その後、あなたは属性のうち、文字列を取得するためにコードを書く必要があるだろう。あなたが列挙型での文字列定数を持つことができませんので

public enum YourEnum 
{ 
    [Description("YourName1")] 
    Name1, 

    [Description("YourName2")] 
    Name2 
} 
+2

+1最初に説明属性が追加されました。ありがとう:) –

+0

属性の文字列を取得する方法は? –

+0

+1 OPの目的は、Enum型の可能性の全範囲を持つものであるという立場を取った唯一の答えです。 – BillW

関連する問題