如果您正在寻找“最短”的方式:
Orientation o = Orientation.East | Orientation.West; // o.ToString() = "East, West"
var c = o.ToString().Split().Count();
甚至更短:
var c = (o + "").Split().Count();
更新
要支持高于 255 的值,您可以使用任何这些丑陋的技巧:
Orientation o = (Orientation) 1023;
var c = ((Orientation)(byte)o + "").Split().Count();
c = ((Orientation)((int)o & 255) + "").Split().Count();
或者只是将枚举定义为字节:
[Flags]
public enum Orientation : byte
{
North = 1,
North_East = 2,
East = 4,
South_East = 8,
South = 16,
South_West = 32,
West = 64,
North_West = 128
}
更新 2
我个人不会在生产代码中使用字符串方法,尤其是在只需要位计数时。
无论如何,我只是为了好玩而想到了另一个黑客。当设置一位时,Base 2 log 将返回一个整数,当设置为 0 时返回 -Infinity,当设置多于一位时返回任何其他值。例如
Math.Log(0, 2 ) // -Infinity
Math.Log(0, 64) // 6.0
Math.Log(0, 65) // 6.0223678130284544
因此,(byte)go != 0
可用于检查是否设置了任何标志,然后Math.Log((byte)go, 2) % 1 == 0
检查是否仅设置了一个标志。
但是,dasblinkenlight 的解决方案似乎是最好的。