2012-04-04 9 views
1

バイナリ演算は、非常に役に立ちますです。このように私は|^&を実行して、新しいシーケンスを放出することができます。ビット演算を使用するためにC#Enumを拡張しますか?

しかし、時にはbase 2の値が添付されていないEnumの値があります( )。

すなわち:

enter image description here

私は、各エントリにに列挙(posssible場合)にEnhance || derive|| attach値をしたいと思います。

ので、私は行うことができるでしょう:

if (MyListItemType== Header |Footer) ... 

は、それは可能ですか?それとも面倒な回避策がありますか?

+0

既存の列挙型で 'Flags'列挙型ではないのですか? – Oded

+0

@oded yeah。 '時には、基底2を持っていないEnumがある... ...'私はフラグが私をここで助けてくれるのを見ない。 –

+0

これは気になるかもしれませんが、おそらく '001010'のようなビット列を作り、列挙型を参照して値を得ることができます – V4Vendetta

答えて

8

私はEnhance ||派生||可能であれば、Enumに各エントリに値を添付します。

あなたはこれを行うことはできません(列挙型を再定義することはできません)。しかし、あなたが所有していないコードでは、それは終わりです。番号付けに依存するコードがすでに存在する可能性があります。int値を変更すると、そのコードが破損します。

しかし、これは通常、列挙型はビットセットではないことを意味します。したがって、おそらくそれを1つとして使用しようとするのは良い考えではありません。

これはコード作成者の意思決定です。あなたの例のリストで

ルック:

var item = ListItemType.Header | ListItemType.Footer | ListItemType.SelectedItem; 

item本当に同時に、ヘッダー、フッター、選択した項目にすることはできますか?これは相互に排他的なオプションのリストです。

5

あなたはflags列挙型を使用したい:

[Flags] 
enum Days2 
{ 
    None = 0x0, 
    Sunday = 0x1, 
    Monday = 0x2, 
    Tuesday = 0x4, 
    Wednesday = 0x8, 
    Thursday = 0x10, 
    Friday = 0x20, 
    Saturday = 0x40 
} 
class MyClass 
{ 
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday; 
} 
+3

私はenumを制御できません!その内部はdll –

4

いいえ、できません。

FlagsEnumerationでマークされていないか、正しいビットマスク値(「2を持たない」)を使用している場合は、ビット単位の操作を使用して意味のある結果を得ることはできません。他の人が言ったように

+0

Flags属性はToString(およびシリアライゼーション)にのみ影響します。ビット操作を有効にする必要はなく、確かに十分ではありません。 –

3

それは行うことはできませんが、私は、拡張メソッドを使用してショートカットを使用します:

public enum MyEnum 
    { 
     This, 
     That, 
     TheOther 
    } 

    public static class MyEnumeExtensions 
    { 
     public static bool IsAny(this MyEnum enumValue, params MyEnum[] values) 
     { 
      return values.Any((e) => e == enumValue); 
     } 
    } 

だから私は使用することができます。

あなたがしたかったほとんど何 ある
myEnum.IsAny(This, That); 

を達成する。

+0

Aliostadはあなたの努力にとても感謝しています。 –

+0

@RoyiNamirいつでも仲間。私は過去に私のプロジェクトで同様のことをしていました。 – Aliostad

関連する問題