欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

按位或组合权限串

程序员文章站 2022-05-27 23:43:47
...
 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次方数的按位与和按位或。