2012-01-17 19 views
2

私はそれがスポーツと呼ばれていると仮定し、列挙型を持っている:列挙型拡張メソッド

enum Sports 
{ 
    Baseball = 1, 
    Basketball = 2, 
    Football = 4, 
    Hockey = 8, 
    Soccer = 16, 
    Tennis = 32, 
    etc... 
} 

私は基本的に、このようなマスクビットをクリア拡張メソッドを追加したい:

Sports Mask = Sports.Baseball | Sports.Football | Sports.Tennis; //37 
Mask.Clear(Sports.Baseball); 
// Mask = Football | Tennis 

これは私が思いついた拡張方法ですが、うまくいきません。 ClearはMaskに影響しません。値は37のままです。この部分を拡張メソッドから変更できるかどうかはわかりません。これを達成する他の方法はありますか?

public static void Clear<T>(this Enum value, T remove) 
{ 
    Type type = value.GetType(); 
    object result; 

    if (type.Equals(typeof(ulong))) 
    { 
    result = Convert.ToUInt64(value) & ~Convert.ToUInt64((object)remove); 
    } 
    else 
    { 
    result = Convert.ToInt64(value) & ~Convert.ToInt64((object)remove); 
    } 

    value = (Enum)Enum.Parse(type, result.ToString()); 
} 
+0

あなたが文字列表現を介して列挙型を表示する予定の場合、それは良いideですa:列挙型定義に '[flags]'属性を追加します。良い説明については、この答えをチェックしてください:http://stackoverflow.com/questions/8447/enum-flags-attribute/8480#8480 –

+0

ありがとう。私は実際のコードに[Flags]タグを持っていますが、私はこれをすばやくハックしました。私の例を実行していたとき、私は "37の代わりに実際の値が表示されないのはなぜですか? "私は[フラグ]を忘れてしまった。 – Mark

答えて

3

enumは値型なので、パラメータのみを変更しました。変更された値を返して元の変数に割り当てることができます。

public static T Clear<T>(this Enum value, T remove) { ... } 
mask = mask.Clear(Sports.Baseball); 
//just like 
//DateTime dt = DateTime.Now; 
//dt = dt.AddHour(1); 

ところで、私はここで延長方法に値するとは思わない。単に使用しないでください:

mask = mask & ~Sports.BaseBall; 
mask = mask & ~anotherMask; 

あなたの拡張方法は、(un)ボクシングのため非常に非効率的です。

+0

あなたの意見では、拡張メソッドは、単にMask&=〜Sports.Baseballを行うよりも悪いことですか?答えはbtwありがとう。編集:私はリフレッシュしていないので、編集で私の質問に答えました。ありがとう。 – Mark

0

インスタンスを参照して拡張メソッドに渡すように要求しています。 But you can't do this in C#

+0

ありがとう、それは多かれ少なかれ私が疑っていたが、これの周りに組み込みの方法があるかどうか疑問に思っていた。 – Mark

1

MSDNブログでのクシシュトフ・クワリーナが2つのリンク以下に列挙型にFlags属性を使用してEnum値をクリアする方法について説明します。

http://blogs.msdn.com/b/kcwalina/archive/2006/08/29/clearingflagenum.aspx

http://weblogs.asp.net/bhouse/archive/2006/08/29/Clearing-Enum-Flags.aspx

サンプル:として

[Flags] 
public enum Foos { 
    A = 1, 
    B = 2, 
    C = 4, 
    D = 8, 
    AB = A | B, 
    CD = C | D, 
    All = AB | CD 
} 

static class Program { 
    static void Main() { 
     Foos value = Foos.AB; 
     Console.WriteLine(ClearFlag(value,Foos.A); 
    } 
    public static Foos ClearFlag(Foos value, Foos flag) { 
     return value & ~flag; 
    } 
} 
関連する問題