检查通用扩展中是否设置了多个标志

时间:2012-11-16 04:12:42

标签: c# enums extension-methods flags

借用此问题的代码How do I check if more than one enum flag is set?我试图实现执行此测试的通用扩展。

我的第一次尝试如下。

public static bool ExactlyOneFlagSet(this Enum enumValue)
{
    return !((enumValue & (enumValue - 1)) != 0);
}

导致了

  

运算符' - '不能应用于'System.Enum'类型的操作数   'INT'

确定有道理,所以我想我会尝试这样的事情

public static bool ExactlyOneFlagSet<T>(this T enumValue) where T : struct, IConvertible
{
    return !(((int)enumValue & ((int)enumValue - 1)) != 0);
}

导致了

  

无法将类型'T'转换为'int'

在阅读了这种行为之后,这也是有道理的,但是接下来如何实现这种扩展方法。任何人都可以帮忙???

1 个答案:

答案 0 :(得分:2)

由于您禁止T实施IConvertible,因此您只需致电ToInt32

public static bool ExactlyOneFlagSet<T>(this T enumValue)
    where T : struct, IConvertible
{
    int v = enumValue.ToInt32(null);
    return (v & (v - 1)) == 0;
}