8

この拡張メソッドがあると考えてください:

public static bool HasAnyFlagInCommon(this System.Enum type, Enum value)
{
    var flags = value.ToString().Split(new string[] { ", " }, 
                                    StringSplitOptions.None);
    foreach (var flag in flags)
    {
        if (type.ToString() == flag)
            return true;
    }
    return false;
}

そして、次の状況:

[Flags]
enum Bla
{
    A = 0,
    B = 1,
    C = 2,
    D = 4
}

Bla foo = Bla.A | Bla.B;
Bla bar = Bla.A;

bar.HasAnyFlagInCommon(foo); //returns true

foo に bar と共通のフラグがあるかどうかを確認したいのですが、拡張メソッドでこの動作を実現するためのより良い方法が必要です。

私もこのように試しましたが、常にtrueを返します:

    public static bool HasAnyFlagInCommon(this System.Enum type, Enum value)
    {
        var flags = Enum.GetValues(value.GetType()).Cast<Enum>()
                                 .Where(item => value.HasFlag(item));
        foreach (var flag in flags)
        {
            if (type == flag)
                return true;
        }
        return false;
    }
4

3 に答える 3

7

Enum 値を単純にulongにキャストできます (基になる型がintのデフォルトではない可能性を考慮するため)。結果が != 0 の場合、少なくとも 1 つのフラグが設定されています。

ulong theValue = (ulong)value;
return (theValue != 0);

結局のところ、enum は byte、sbyte、short、ushort、int、uint、long、または ulong のいずれかによってサポートされることに注意してください。

http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

設定されているフラグは、バッキング タイプでオンになっている対応するビットと同じです。上記のulongは、すべてのビットがオフになっている場合にのみ 0 になります。

アップデート

この回答が投稿された後に質問が編集されたため、その更新を説明するための変更を次に示します。

次に、列挙型にその列挙型の別のインスタンスと共通のフラグがあるかどうかを確認するには、ビットごとの and を使用できます。両方に共通のビット位置が設定されている場合、結果はゼロ以外になります。

var anyFlagsInCommon = ((ulong)value) & ((ulong)compareTo);
于 2012-12-13T18:41:12.923 に答える
4

何かのようなもの

public static bool HasAnyFlagInCommon(this System.Enum type, Enum value)
{
    return (((long)type) & ((long)value)) != 0;
}

は、両方の列挙型に設定されている任意のビットに対して与え&られるため、そのようなビットがある場合、結果はゼロではありません。1

long(列挙型の基になる型に関係なく機能することを期待して使用しましたint。あなたの場合は問題ないはずです。)

于 2012-12-13T19:55:30.143 に答える