检查是否只在枚举中设置了这些标志

Max*_*ich 5 c# flags bitwise-operators

我已经创建了一个扩展方法..

public static bool AllFlagsSet<T>(this T input, params T[] values) where T : struct, IConvertible
{
    bool allSet = true;
    int enumVal = input.ToInt32(null);

    foreach (T itm in values)
    {
        int val = itm.ToInt32(null);
        if (!((enumVal & val) == val)) 
        {
            allSet = false;
            break;
        }
    }

    return allSet;
}
Run Code Online (Sandbox Code Playgroud)

这对于我需要的目的非常有用,但是我现在需要创建一个具有相同签名的方法,该方法仅检查是否仅设置了这些值.

基本上是这样的.

public static bool OnlyTheseFlagsSet<T>(this T input, params T[] values) where T : struct, IConvertible
{
}
Run Code Online (Sandbox Code Playgroud)

我能想到这样做的唯一方法是通过获取所有可用的枚举值来检查设置并确认只提供了两个.

有没有其他方法可以使用某种按位运算来解决这个问题?

Ale*_*kov 5

对所有必需的标志执行"或"并与输入进行比较 - 应该相等.与以下类似,使用正确的循环来计算左侧的值:

var onlyTheseFlagsSet = (value[0] | value[1]) == input;
Run Code Online (Sandbox Code Playgroud)