C#关于枚举和反射,invoke调用方法的使用

最近发现微软在命名枚举值有些技术,来深挖一下先定义窗体,加载窗体时候反射

        //可以在添加一层来记录类型(type)防止不同类相同方法天剑不进去
        private Dictionary<string, MethodInfo> AttributeMethodInfoDic = new Dictionary<string, MethodInfo>();


        //通过反射获取TextClass类里的所有类实例和被标记的方法
        private void Form1_Load(object sender, EventArgs e)
        {
            Assembly assembly = Assembly.LoadFile(Path.Combine(@"D:\站机程序备份\小功能测试\TextClass\bin\Debug", "TextClass.dll"));
            Type[] types= assembly.GetTypes();
            foreach (Type  item in types)
            {
                if (null == item) continue;
                MethodInfo[] methodinfos = item.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);  // BindingFlags.Instance |BindingFlags.NonPublic 可以获取类私有方法(什么参数都不加可以获取类的所有公有方法)  这个系统在定义枚举值也 很有特点?思考为啥不同枚举值可以用
                                                                                                            //位运算符写上不同的枚举值就可以打上很多枚举值     如果有& 运算符呢  看最后小例子  
                foreach (MethodInfo itemMethod in methodinfos)
                {
                    AttributeSqliteMark sqliteMark = null;
                    object[] customAttributeObjArry = itemMethod.GetCustomAttributes(typeof(ClassLibrary.AttributeSqliteMark), false);
                    foreach (object itemObj in customAttributeObjArry)
                    {
                        if (itemObj is AttributeSqliteMark)
                        {
                            sqliteMark = itemObj as AttributeSqliteMark;
                            if (sqliteMark.IsMatchAbility (EnumPeopleAbility.DriveCar   ))  //这里可以过滤这个函数时候具有改能力  经典
                            {
                                if (!AttributeMethodInfoDic.ContainsKey(sqliteMark.Name))
                                    AttributeMethodInfoDic.Add(sqliteMark.Name, itemMethod);
                            }
                           
                        }
                    }
                    
                }
         



            }
        }

        private void button1_Click(object sender, EventArgs e)
        {

            object ret = AttributeMethodInfoDic["这是一个好函数"].Invoke(null, new object[] { Convert.ToInt32(textBox1.Text) });
            MessageBox.Show(ret.ToString());
           
        }

然后定义一个类 方法体上打上标签

public class TextClass
    {
        public const string Fun_说你好 = "这是一个好函数";
        
        [AttributeSqliteMark(Fun_说你好 ,5,"123",EnumPeopleAbility.DriveAirplan|EnumPeopleAbility.DriveCar |EnumPeopleAbility.DriveTruk )]   // 画龙点睛之笔
        public static bool SayHellow(int temInt)
        { 
            Console.Write("你好哈!");
            return temInt > 5;
        }
        public void Say()
        { }
        void Write()
        { }
    }

最后来个枚举 特别注意这个IsMatchAbility 方法

 public enum EnumPeopleAbility
    {
        DriveBike=1,
        DriveCar=2,
        DriveTruk=4,
        DriveTrain=8,
        DriveTank=16,
        DriveAirplan=32,
        DriveArtillery=64
    }



    public class AttributeSqliteMark : Attribute
    {
        public readonly string Name;
        public readonly int Age;
        public readonly string Dbtype;
        public readonly EnumPeopleAbility Ability;
        public AttributeSqliteMark(string Name, int Age, string Dbtype, EnumPeopleAbility Ability)
        {
            this.Name = Name;
            this.Age = Age;
            this.Dbtype = Dbtype;
            this.Ability = Ability;
        }

        public bool IsMatchAbility(EnumPeopleAbility ability)
        {

            if ((this.Ability & ability) > 0 )
            {
                return true;
            }
            return false;
        }
    }

致辞全部结束 巧妙的运用了位 & 和 I 运算 ,可以收藏做个小技巧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

望天hous

你的鼓励是我最大动力~谢谢啦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值