当我们用反射的时候,需要指定绑定标志,如下:
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 }