5

列挙にフラグがあるかどうかを確認する拡張メソッドを作成したいと考えています。

DaysOfWeek workDays = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday;
// instead of this:
if ((workDays & DaysOfWeek.Monday) == DaysOfWeek.Monday)
   ...

// I want this:
if (workDays.ContainsFlag(DaysOfWeek.Monday))
   ...

どうすればこれを達成できますか? (すでにこれを行っているクラスがある場合は、これをどのようにコーディングできるかの説明をいただければ幸いです。私はこのメソッドをいじりすぎていました!)

前もって感謝します

4

2 に答える 2

11

.NET 4 には既にこの機能が含まれているため、可能であればアップグレードしてください。

days.HasFlag(DaysOfWeek.Monday);

アップグレードできない場合、上記のメソッドの実装は次のとおりです。

public bool HasFlag(Enum flag)
{
    if (!this.GetType().IsEquivalentTo(flag.GetType())) {
        throw new ArgumentException(Environment.GetResourceString("Argument_EnumTypeDoesNotMatch", flag.GetType(), this.GetType())); 
    }

    ulong uFlag = ToUInt64(flag.GetValue()); 
    ulong uThis = ToUInt64(GetValue());
    return ((uThis & uFlag) == uFlag); 
}

同等の拡張メソッドを簡単に構築できます。

public static bool HasFlag(this Enum @this, Enum flag)
{
    // as above, but with '@this' substituted for 'this'
}
于 2010-10-13T22:05:33.180 に答える
0

最近、この問題に遭遇しました。

Enum の型がわからない場合は、Enum を int にキャストし、Enum 静的メソッドを使用して Enum フィールド名を値に解析し、op_BitwiseAnd を使用して値を比較できます。

興味があれば、後でコードを更新しますが、今はドアを出ています。

于 2010-10-13T22:38:52.377 に答える