借用此问题的代码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'
在阅读了这种行为之后,这也是有道理的,但是接下来如何实现这种扩展方法。任何人都可以帮忙???
答案 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;
}