0

enum を効果的に拡張して 2 つ以上のオプションを持たせるにはどうすればよいですか。ファイルから行ごとにイベントを読み取っています。私はコンストラクタを持っています

public enum EventType
{ A,D }

public class Event
{
    public EventType Type { get; set; }

}

Type プロパティを次のように割り当てました。

 Type = tokens[2].Equals("A") ? EventType.A : EventType.D,

ここtoken[2]で、「A」のような値を保持する文字列です。

Aこれは、としかない場合にうまく機能しますがD、さらに 2 つのタイプが必要です。と言うRC。それらを列挙型フィールドに追加すると、どのようにタイプを取得できますか? 上記は、Type を変数として使用しているかのようにコンパイル エラーを出しています。

すぐに助けていただきありがとうございます。ありがとう

4

4 に答える 4

5

これを行うには、実際には3つの賢明な方法しかありません。

Enum.TryParse

トークンが常に列挙型メンバーに正確Enum.TryParseに対応する場合は、次を使用できます。

EventType type;
if (Enum.TryParse(tokens[2], out type)) {
    Type = type;
}
else { /* token does not exist as an enum member */ }

このアプローチは最も単純ですが、おそらく次のアプローチよりも遅く、別の欠点もあります。提供するコードの作成tokens[2]者と列挙型の作成者は、コードを常に同期させておく必要があります。

辞書を使う

var dict = new Dictionary<string, EventType>
{
    { "A", EventType.A },
    { "D", EventType.D },
    // more items here
}

Type = dict[tokens[2]]; // no error checking, please add some

これにはいくつかの設定が必要ですが、おそらく最も高速であり、入力文字列や列挙値の変更を考慮することもできます。

属性を使用する

または、列挙型メンバーにカスタム属性で注釈を付け、リフレクションを使用してこの属性の値に基づいて正しいメンバーを見つけるヘルパー メソッドを作成することもできます。このソリューションには用途がありますが、最も可能性が低い候補です。ほとんどの場合、2 つの選択肢のいずれかを選択する必要があります。

于 2012-05-22T10:21:33.200 に答える
0

Enum.Parse文字列を解析するために使用できます。エラー処理のためEnum.GetNames(typeof(EventType))に、列挙型のすべての可能な名前を含む、返された文字列配列を使用して反復することができます。

var type = (EventType)Enum.Parse(typeof(EventType), tokens[2]);
于 2012-05-22T10:22:48.100 に答える
0

Enum.Parse一致する値を取得するために使用できます。

Type = Enum.Parse(typeof(EventType), tokens[2])

tokens[2]が で定義されていない場合EventTypeEnum.Parse例外がスローされるため、 を使用Enum.IsDefinedして、文字列の列挙値があるかどうかを確認できます。

Enum.IsDefined(typeof(EventType), tokens[2]) 
于 2012-05-22T10:24:28.670 に答える
-2
EventType et;
switch(tokens[2]) 
{
   case "A":
      et=EventType.A;
      break;
   case "B":
      et=EventType.B;
      break;
   case "C":
      et=EventType.C;
      break;
}
return et;
于 2012-05-22T10:22:53.090 に答える