c#之枚举标志位

参考网址:https://msdn.microsoft.com/zh-cn/library/system.enum.hasflag.aspx
使用[Flags],就是用一个int数值存储多个状态位,所有的数据在计算机里计算都会转换为二进制, 1 是 0 否。

所以枚举标志位就是根据状态依次设置值。

举例:

    [Flags]
    public enum FruitItems {
        Strawberry = 1,                 //草莓
        Apple = Strawberry * 2,         //苹果
        Blueberry = Apple * 2,          //蓝莓
        Cherry = Blueberry * 2,         //樱桃
        Grape = Cherry * 2,             //葡萄
        Peach = Grape *2                //桃
    }

    void Start() {
        FruitItems myOrder = FruitItems.Apple | FruitItems.Cherry | FruitItems.Grape;
        //Debug.Log("" + myOrder.HasFlag(FruitItems.Apple));
    }
用物品的开头字母代表枚举,从后往前依次是:
P G C  B A S

例如myOrder, A 1、C 1、G 1,所以二进制依次是 011010,转换为十进制就是26。这样一个int值就可以储存多个状态。

很遗憾,untiy运行提示无HasFlag方法。可以导入dll,但是这样无疑复杂了。只能自己写了:
    void Start() {
        FruitItems myOrder = FruitItems.Apple | FruitItems.Cherry | FruitItems.Grape;      

        FruitItems checkContain1 = FruitItems.Blueberry | FruitItems.Peach;
        FruitItems checkContain2 = FruitItems.Cherry | FruitItems.Peach;
        FruitItems checkContain3 = FruitItems.Cherry & FruitItems.Peach;

        Debug.Log(string.Format("{0},{1},{2}", Contains(myOrder, FruitItems.Apple), Contains(myOrder, FruitItems.Cherry), Contains(myOrder, FruitItems.Grape)));
        Debug.Log(string.Format("{0},{1}", Contains(myOrder, FruitItems.Blueberry), Contains(myOrder, FruitItems.Peach)));
        Debug.Log(string.Format("{0},{1},{2}", Contains(myOrder, checkContain1), Contains(myOrder, checkContain2), Contains(myOrder, checkContain3)));
    }

    public bool Contains(Enum enums, Enum target) {
        int enumNum = (int)Convert.ChangeType(enums, TypeCode.Int32);
        return (Convert.ToInt32(target) & enumNum) > 0;
    }

运行输出结果:


希望大家指点一下,可能算法不是很好。


猜你喜欢

转载自blog.csdn.net/xj1009420846/article/details/80633284
今日推荐