枚举Enum

当我们用反射的时候,需要指定绑定标志,如下:

FieldInfo field = obj.GetType().GetField(name, BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic);

在MSDN里面有这样一句话:“用2的幂(即 1、2、4、8 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠。

我们看下BingingFlags的定义:他就是按照MSDN上的说法定义的,我们来看看有什么用

 

Default 表示不指定!

定义一个枚举:

enum ColorEnum 
{
        Red = 1, Green = 2, Blue = 4, Yellow = 8
}

获取传入的枚举值:(如果枚举不定义成2的幂次方,是无法获取正确传的值的!)

如果枚举定义成  Red = 1, Green = 2, Blue = 4, Yellow = 3  是会报错的(测试发现)!

定义成  Red = 1, Green = 2, Blue = 4, Yellow = 6 输出的值是和传入的值是不相同的!

而枚举定义成2的幂次方,那么无论成员是什么顺序,值的跨度多大也不会出错!依旧输出正确的值!

           ColorEnum color_2 = ColorEnum.Red | ColorEnum.Green | ColorEnum.Yellow;

            string num = color_2.ToString();//输出为数值 11

            List<double> list = new List<double>();
            String binary = Convert.ToString(Convert.ToInt32(num), 2); //2表示把11转换成二进制数据  为1011
            int index = binary.Length - 1;  //循环的次数
            foreach (char ch in binary) {
                if (ch == '1') {
                    list.Add(Math.Pow(2, index));  //算出二进制为1的每一位的2的幂次方
                }
                index--;
            }
            foreach (var item in list) {
                ColorEnum c = (ColorEnum)Enum.Parse(typeof(ColorEnum), item.ToString());
                Console.WriteLine(c.ToString());//输出 yellow green red
            }
原文地址:https://www.cnblogs.com/MrZivChu/p/enum.html