按位或组合权限串
public enum BindingFlags { // 摘要: // 不指定绑定标志。 Default = 0, // // 摘要: // 指定当绑定时不应考虑成员名的大小写。 IgnoreCase = 1, // // 摘要: // 指定只应考虑在所提供类型的层次结构级别上声明的成员。 不考虑继承成员。 DeclaredOnly = 2, // // 摘要: // 指定实例成员将包括在搜索中。 Instance = 4, // // 摘要: // 指定静态成员将包括在搜索中。 Static = 8, // // 摘要: // 指定公共成员将包括在搜索中。 Public = 16, // // 摘要: // 指定非公共成员将包括在搜索中。 NonPublic = 32, // // 摘要: // 指定应返回层次结构上的公共静态成员和受保护的静态成员。 不返回继承类中的私有静态成员。 静态成员包括字段、方法、事件和属性。 不返回嵌套类型。 FlattenHierarchy = 64, // // 摘要: // 指定要调用一个方法。 它不能是构造函数或类型初始值设定项。 InvokeMethod = 256, // // 摘要: // 指定“反射”应该创建指定类型的实例。 调用与给定参数匹配的构造函数。 忽略提供的成员名。 如果未指定查找类型,将应用 (Instance |Public)。 // 调用类型初始值设定项是不可能的。 CreateInstance = 512, // // 摘要: // 指定应返回指定字段的值。 GetField = 1024, // // 摘要: // 指定应设置指定字段的值。 SetField = 2048, // // 摘要: // 指定应返回指定属性的值。 GetProperty = 4096, // // 摘要: // 指定应设置指定属性的值。 对于 COM 属性,指定此绑定标志与指定 PutDispProperty 和 PutRefDispProperty 是等效的。 SetProperty = 8192, // // 摘要: // 指定应调用 COM 对象的 PROPPUT 成员。 PROPPUT 指定使用值的属性设置函数。 如果属性同时具有 PROPPUT 和 PROPPUTREF,而且需要区分调用哪一个,请使用 // PutDispProperty。 PutDispProperty = 16384, // // 摘要: // 指定应调用 COM 对象的 PROPPUTREF 成员。 PROPPUTREF 指定使用引用而不是值的属性设置函数。 如果属性同时具有 PROPPUT // 和 PROPPUTREF,而且需要区分调用哪一个,请使用 PutRefDispProperty。 PutRefDispProperty = 32768, // // 摘要: // 指定提供参数的类型必须与对应形参的类型完全匹配。 如果调用方提供一个非空 Binder 对象,则“反射”将引发异常,因为这意味着调用方正在提供的 // BindToXXX 实现将选取适当的方法。 ExactBinding = 65536, // // 摘要: // 未实现。 SuppressChangeType = 131072, // // 摘要: // 返回其参数计数与提供参数的数目匹配的成员集。 此绑定标志用于所带参数具有默认值的方法和带变量参数 (varargs) 的方法。 此标志应只与 System.Type.InvokeMember(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Object,System.Object[],System.Reflection.ParameterModifier[],System.Globalization.CultureInfo,System.String[]) // 一起使用。 OptionalParamBinding = 262144, // // 摘要: // 在 COM 互操作中用于指定可以忽略成员的返回值。 IgnoreReturn = 16777216, }
public enum DataFormType { /// <summary> /// 查找 /// </summary> Search=0, /// <summary> /// 刷新 /// </summary> Refresh=2, /// <summary> /// 增加 /// </summary> Add=4, /// <summary> /// 修改 /// </summary> Update=8, /// <summary> /// 删除 /// </summary> Delete=16, /// <summary> /// 导出 /// </summary> Export=32, /// <summary> /// 导入 /// </summary> Import=64 }
使用
.SetFormType(Fap.Controls.JqGrid.Enums.DataFormType.Add | Fap.Controls.JqGrid.Enums.DataFormType.Delete | Fap.Controls.JqGrid.Enums.DataFormType.Update)
按位或
原理
第一,2的8位二进制值为00000010
4的8位二进制值为00000100
8的8位二进制值为00001000
第二,当对8和4进行按位或操作后,结果为:
4|8 = 12
00000100 |00001000 = 00001100
为什么会是这样呢?在进行按位或操作时 00000001|00000001=00000001 ;00000001|00000000=1 ;00000000|00000000=00000000
也就是说除了0|0结果是0外,其它运算结果的都是1
所以 00000100 |00001000 = 00001100
也就说上面的 purview = k2|k3 的二进制值结果是 purview =00000100 |00001000 =00001100了
第三,当对8和4进行按位与操作后,结果为:
4&8=0
00000100 &00001000 = 00000000
同样为什么会是这样呢?在进行按位与操作时 00000001&00000001=00000001 ;00000001&00000000=00000000 ;00000000&00000000=00000000
也就是说除了1&1结果是1外,其它运算结果的都是0
所以 00000100 &00001000 = 00000000
上面的if((purview & k1) >0)的结果就是 00001100&00000010 =00000000 也就是(0>0)=false
同样if((purview & k2) >0)的结果就是 00001100&00000100 =00000100=4=k2 也就是 (4>0)=true
这样我们就理解组合权限串和判断权限的原理了,说白了就是对2N次方数的按位与和按位或。
上一篇: protobuf 格式分析