如何根据组合值res_flags判断枚举animals中哪些选项已勾选
解决方法
首先要注意,你当前定义的animals枚举不适合用于位掩码操作——因为枚举值不是2的整数次幂(比如Mouse=3等于Cat|Dog的结果),这会导致不同的勾选组合得到相同的res_flags,无法准确区分哪些复选框被勾选。正确的做法是给枚举加上[Flags]特性,并将每个成员的值设为2的幂:
[Flags] public enum animals : int { None = 0, Cat = 1, // 2^0 Dog = 2, // 2^1 Mouse = 4, // 2^2 Rat = 8, // 2^3 Lizzard = 16 // 2^4 }
若无法修改原有枚举(比如已保存历史数据),则只能基于现有值判断,但会存在歧义风险(比如
res_flags=3无法区分是勾选了Mouse,还是同时勾选了Cat和Dog)。
不管是修正后的枚举,还是你坚持使用原有枚举,窗口启动时都可以通过位与操作判断每个复选框的勾选状态:
// 假设res_flags是从存储中读取的int值 this.chbCat.IsChecked = (res_flags & (int)animals.Cat) != 0; this.chbDog.IsChecked = (res_flags & (int)animals.Dog) != 0; this.chbMouse.IsChecked = (res_flags & (int)animals.Mouse) != 0; this.chbRat.IsChecked = (res_flags & (int)animals.Rat) != 0; this.chbLizzard.IsChecked = (res_flags & (int)animals.Lizzard) != 0;
逻辑很简单:位与操作会保留res_flags中与目标枚举值对应的二进制位,如果结果不为0,说明该位被设置过,即对应的复选框之前处于勾选状态。
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

