繁体   English   中英

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

[英]Check if exclusively only these flags set in enumeration

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

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;
}

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

基本上是这样的。

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

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

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

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

var onlyTheseFlagsSet = (value[0] | value[1]) == input;

排他性要求意味着

input = values[0] | values[1] | ... | values[values.Length - 1]

那么,这是你的实现:

return input.ToInt32(null) == values.Aggregate(0, 
       (total, next) => total | next.ToInt32(null));

这会翻转每个输入值的位。 如果仅设置了这些值,则结果值将为零。 否则,如果未在input中设置值,则将位翻转为1,这将使值保持非零。

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

    foreach (T itm in values)
    {
        int val = itm.ToInt32(null);
        enumVal = enumVal ^ val;                
    }

    return (enumVal == 0);
}

我是否遗漏了某些东西,或者您是否只能将参数T []值相加并检查输入是否等于结果?
如果您只想要那些标志而不需要其他标志,则输入应等于这些标志的总和。

假设您可以将输入转换为枚举:

foreach(MyFlags flag in values)
    if (!input.HasFlag(flag))
        return false;

return true;

是的,我很懒。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM