0

借用这个问题的代码如何检查是否设置了多个枚举标志?我试图实现一个执行此测试的通用扩展。

我的第一次尝试如下。

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”

在阅读了这种行为之后,这也是有道理的,但是究竟如何实现这种扩展方法。有好心人帮忙吗???

4

1 回答 1

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;
}
于 2012-11-16T04:17:16.773 回答