zoukankan      html  css  js  c++  java
  • 反射-2

     private void button1_Click(object sender, EventArgs e)
            {
                Type tDog = typeof(Dog);
                Type tCat = typeof(Cat);
                //用Activator创建一个类型对象,这个类必须包含一个无参构造函数
    
                Dog d1 = Activator.CreateInstance(tDog) as Dog;
    
                Cat c1 = Activator.CreateInstance(tCat) as Cat;
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                Dog d1 = new Dog() { name = "小白", age = 3, Gender = false };
                ShowObjFields(d1);
    
            }
            public void ShowObjFields(object o)
            {
                Type tObj = o.GetType();
                System.Text.StringBuilder sb = new StringBuilder(20);
                //2.获取对象所属类的所有对象
                FieldInfo[] fields = tObj.GetFields();
                foreach (FieldInfo f in fields)
                {
                    sb.Append(f.Name + "=" + f.GetValue(o) + "
    ");
                }
                MessageBox.Show(sb.ToString());
            }
            //获取所有属性
            private void button3_Click(object sender, EventArgs e)
            {
                Dog d1 = new Dog() { name = "小白", age = 3, Gender = false };
                ShowObjProperties(d1);
            }
            public void ShowObjProperties(object o)
            {
                Type tObj = o.GetType();
                System.Text.StringBuilder sb = new StringBuilder(20);
                //2.获取对象所属类的所有对象
                PropertyInfo[] PropertyInfos = tObj.GetProperties();
                foreach (PropertyInfo f in PropertyInfos)
                {
                    sb.Append(f.Name + "=" + f.GetValue(o) + "
    ");
                }
                MessageBox.Show(sb.ToString());
            }
            /// <summary>
            /// 给字段赋值
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button4_Click(object sender, EventArgs e)
            {
                Type dType = typeof(Dog);
                Dog d = new Dog();
                FieldInfo fname = dType.GetField("name");
                fname.SetValue(d, "花花");
                MessageBox.Show(d.name);
    
                //为指定的属性赋值
                PropertyInfo pHoby = dType.GetProperty("Hoby");
                pHoby.SetValue(d, "咬骨头");
                MessageBox.Show(d.Hoby);
            }
            #region 加载方法
            /// <summary>
            /// 加载方法
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button5_Click(object sender, EventArgs e)
            {
                Dog d1 = new Dog() { name = "小白", age = 3, Gender = false };
                FillCBBWithObjMethodName(d1);
            }
            /// <summary>
            /// 根据对象 获取方法 
            /// </summary>
            /// <param name="o"></param>
            public void FillCBBWithObjMethodName(object o)
            {
                Type tObj = o.GetType();
                //获取 类中 直接定义的,实例的,公共方法
                MethodInfo[] methods = tObj.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
                foreach (MethodInfo m in methods)
                {
                    comboBox1.Items.Add(m.Name);
                }
            }
            #endregion
    
            #region 调用方法
            private void button6_Click(object sender, EventArgs e)
            {
                Dog d1 = new Dog() { name = "小白", age = 3, Gender = false };
                InvokeMethodByName(d1);
    
            }
            public void InvokeMethodByName(object o)
            {
                string StrMethod = comboBox1.Text;//获取选中的方法名
                Type tObj = o.GetType();
                ///获取指定的方法对象
                MethodInfo method = tObj.GetMethod(StrMethod);
                string strRes = method.Invoke(o, null).ToString();//o就是为类里的this赋值
                MessageBox.Show(strRes);
            }
            #endregion
    
            #region 获取构造函数
            private void button7_Click(object sender, EventArgs e)
            {
                Type tDog = typeof(Dog);
                FillConstructor(tDog);
            }
            void FillConstructor(Type t)
            {
                //1获取所有公有的构造函数
                ConstructorInfo[] constructors = t.GetConstructors();
                //2遍历 填充构造函数
                foreach (ConstructorInfo c in constructors)
                {
                    comboBox2.Items.Add(c.GetParameters().Length.ToString());
                }
            }
            #endregion
    
            #region 调用构造函数
            private void button8_Click(object sender, EventArgs e)
            {
                Type tDog = typeof(Dog);
                int strParasLength = int.Parse(comboBox2.Text);
                ConstructorInfo constructorInfo = null;
                switch (strParasLength)
                {
                    case 0:
                        constructorInfo = tDog.GetConstructor(null);
                        break;
                    case 1:
                        constructorInfo = tDog.GetConstructor(new Type[1] { typeof(string) });
                        break;
                    case 2:
                        constructorInfo = tDog.GetConstructor(new Type[2] { typeof(string), typeof(int) });
                        break;
                }
                Dog d = null;
                //通过调用指定参数构造函数 ,创建DOg对象
                if (constructorInfo != null)
                {
                    switch (strParasLength)
                    {
                        case 0:
                            d = constructorInfo.Invoke(null) as Dog; //构造函数返回的是类的对象
                            break;
                        case 1:
                            d = constructorInfo.Invoke(new object[1] { "小黑" }) as Dog;
                            break;
                        case 2:
                            d = constructorInfo.Invoke(new object[2] { "小白", 3 }) as Dog;
                            break;
                    }
                }
                string res = d.ShoutHi();
                MessageBox.Show(res);
            }
            #endregion
  • 相关阅读:
    winform窗口打开特效及窗口位置居中
    C# Installer Projects 打包工具
    C#
    MVVM模式开发WinForm-ReactiveUI
    C#实现类似百度网盘、育网校园云盘在“我的电脑”磁盘驱动器
    MVVM框架
    自制2048小游戏
    一个无限循环轮播图 HCCycleView
    Xcode插件及cocoapods不能正常使用的解决方法
    Runtime — 运行时机制
  • 原文地址:https://www.cnblogs.com/sumg/p/3800968.html
Copyright © 2011-2022 走看看