反射的操作


反射


1.0 获取程序集对象

2.0 获取 程序集里的 类 的 类型对象(类的类)

3.0 监测 类 是否实现了某个接口

4.0 字段的 操作

5.0 属性的 操作

6.0 方法的 操作

7.0 通过激活器创建 对象

8.0 通过构造函数 创建 对象

9.0 获取私有成员



 

using System.Reflection;//导入反射命名空间

 

 

创建一个类或类库  设置一个委托 对象

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace S01反射

{

    public delegate void DGSayHi(string name);

}

 

 

创建一个测试类 验证  event

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace S01反射

{

    public class Test

    {

        public event DGSayHi dgSayHi;

        /* 事件编译后:

         * private DGSayHi dgSayHi;

         * public event DGSayHi dgSayHi

         * {

         *     add{ dgSayHi +=value; }

         *     remove{ dgSayHi -= value; }

         * }

         */

 

        private string name;

        public string Name

        {

            get { return name; }

            set { name=value; }

        }

 

        public void Test2()

        {

            dgSayHi = new DGSayHi(T);

        }

 

        public void T(string a)

        { }

    }

}

 

 

Cat

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace S02MODEL

{

    public class Cat:IFlyable

    {

        string name;

        public string Bark()

        {

            return "~~" + name;

        }

 

        public void Fly()

        {

            System.Windows.Forms.MessageBox.Show("我会飞哦~~小猫");

        }

    }

}

 

 

Dog

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace S02MODEL

{

    public class Dog

    {

        public Dog(string name) {

            this.name = name;

        }

        public Dog(string name,bool gender)

        {

            this.name = name;

            this.gender = gender;

        }

 

        private bool gender;

 

        public string name;

        public int Age

        {

            get;

            set;

        }

 

        public string Bark()

        {

            return "~~" +this.name;

        }

 

        public string Bark(string pinzhong,int aaa)

        {

            return "~~"+pinzhong+",name=" + this.name;

        }

 

        public static string Bit()

        {

            return "咬死你~~~~~";

        }

 

        public static string Bit2(string toEr,string fromEr)

        {

            return "咬死你~~~~~" + toEr + "," + fromEr;

        }

    }

}

 

 

 

接口

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace S02MODEL

{

    public interface IFlyable

    {

        void Fly();

    }

}

 

 

Pig

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace S02MODEL

{

    internal class Pig

    {

        public string name;

    }

}

 

 

 

 

 

 

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Reflection;//导入反射命名空间

using S02MODEL;

 

namespace S01反射

{

    public partial class Form1 : Form

    {

        

        //Test t = new Test();

        t.dgSayHi = null;

        t.dgSayHi("123");

         通过事件 来操作 委托变量! 

         通过事件 向其封装的 委托变量 注册 一个方法

        //t.dgSayHi += t_dgSayHi;

         通过事件 向其封装的 委托变量 移除 一个方法

        //t.dgSayHi -= t_dgSayHi;

 

        public Form1()

        {

            InitializeComponent();

            

        }

 

        /// <summary>

        /// 1.0 获取程序集对象

        /// </summary>

        private void btnRef01_Click(object sender, EventArgs e)

        {

            //1.获取当前正在运行的 程序集对象

            //Assembly ass01 = Assembly.GetExecutingAssembly();

            //Type [] types  = ass01.GetTypes();

 

            //***********【重点】2.按照指定路径 加载程序集对象***************

            Assembly ass02 = Assembly.LoadFrom(@"F:\03.Net\DotNet\反射\Code\S01反射\S02MODEL\bin\Debug\S02MODEL.dll");

            Type[] types = ass02.GetTypes();

 

            //3.获取当前正在运行的 应用程序域 里的所有的程序集

            //Dog dog = new Dog("小白");

            //AppDomain domain = AppDomain.CurrentDomain;

            //Assembly [] asses= domain.GetAssemblies();

        }

 

        /// <summary>

        /// 2.0 获取 程序集里的 类 的 类型对象(类的类)

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btnType_Click(object sender, EventArgs e)

        {

            //1.通过对象获取 其类型

            S02MODEL.Dog dog = new Dog("小白");

            Type dogType01 = dog.GetType();

            //Type dogType02 = GetObjType(dog);

 

            //2.直接 获取 指定 类的 类型对象

            Type catType03 = typeof(Test); //typeof(S02MODEL.Cat);

 

            //3. 获取程序集里 的类型Type----------------------------

            Assembly ass02 = Assembly.LoadFrom(@"F:\03.Net\DotNet\反射\Code\S01反射\S02MODEL\bin\Debug\S02MODEL.dll");

 

            //3.1.获取程序集里的一个 类型 对象---------------

            //Type typeCat = ass02.GetType("S02MODEL.Cat");

 

            1.1获取类里的 各种成员 对象

            //FieldInfo [] fields = typeCat.GetFields();

            //MethodInfo[] methods = typeCat.GetMethods();

            //ConstructorInfo [] cons= typeCat.GetConstructors();

 

 

            //3.2.通过程序集 获取 所有的 public 类的类型对象

            Type[] publicTypes = ass02.GetExportedTypes();

 

            //3.3.通过程序集 获取 所有的类

            Type[] types = ass02.GetTypes();

        }

 

        Type GetObjType(object obj)

        {

            return obj.GetType();

        }

 

        /// <summary>

        /// 3.0 监测 类 是否实现了某个接口

        /// </summary>

        private void btnTestInterface_Click(object sender, EventArgs e)

        {

            Type flyType = typeof(S02MODEL.IFlyable);

            Type catType = typeof(S02MODEL.Cat);

            Type dogType = typeof(S02MODEL.Dog);

            //IsAssignableFrom 判断 某个类 是否实现了 flyType接口!

            MessageBox.Show(flyType.IsAssignableFrom(catType).ToString());

            MessageBox.Show(flyType.IsAssignableFrom(dogType).ToString());

 

            Dog dog = new Dog("小白");

            //判断 dog对象 是否是 Dog类的实例!

            MessageBox.Show(dogType.IsInstanceOfType(dog).ToString());

        }

 

        /// <summary>

        /// 4.0 字段的 操作

        /// </summary>

        private void btnField_Click(object sender, EventArgs e)

        {

            //获取 Dog 类的类型对象(描述类信息)

            Type typeDog = typeof(Dog);

            //获取 Dog类 的 name 字段对象(描述字段信息)

            FieldInfo fName = typeDog.GetField("name");

 

            Dog dog = new Dog("小白");

 

            //通过字段对象 为 Dog对象 里的 这个字段 赋值

            fName.SetValue(dog, "来福旺财");//dog.name = "来福旺财";

            //通过字段对象 从 Dog对象 里的 这个字段 取值

            string dogNameStr = fName.GetValue(dog).ToString();

        }   

 

        /// <summary>

        /// 5.0 属性的 操作

        /// </summary>

        private void btnProperty_Click(object sender, EventArgs e)

        {

            //Type typeDog = typeof(Dog);

            Dog dog = new Dog("小白") { name = "小标", Age = 1 };

            //1.获取对象的类型对象

            Type typeDog = dog.GetType();

            //2.获取 对象的 Age 属性对象

            PropertyInfo proAge = typeDog.GetProperty("Age");

            //3.通过属性对象 获取 dog实例 中的 Age属性的值

            int age = (int)proAge.GetValue(dog, null);

            //4.通过属性对象 设置 dog实例 中的 Age属性的值

            proAge.SetValue(dog, 10, null);

 

        }

 

        /// <summary>

        /// 6.0 方法的 操作

        /// </summary>

        private void btnMethod_Click(object sender, EventArgs e)

        {

            //此对象所属的Dog类来自于 第一个项目中 添加的 S02Model程序集!

            Dog dog = new Dog("小白") { name = "小白2", Age = 22 };

 

            //经典错误:两个同名类,来自复制出来的 不同的程序集,也不能算作同一个类!

            //Assembly ass = Assembly.LoadFrom(@"F:\03.Net\DotNet\反射\Code\S01反射\S02MODEL\bin\Debug\S02MODEL.dll");

            Dog类型,来自于 第二个项目中 的 程序集!

            //Type typeDog2 = ass.GetType("S02MODEL.Dog");

            //MethodInfo methodBark = typeDog2.GetMethod("Bark");

 

            报错:因为 dog 对象 所属的类 来自于第一个项目的引用程序集;而methodBark方法所属的类来自于 第二个项目的程序集

            //methodBark.Invoke(dog, null);

 

 

 

            Type dogType = typeof(Dog);

            //1.获取 Dog类里的 Bark 方法对象

            MethodInfo method = dogType.GetMethod("Bark",new Type[0]);

            //通过方法对象 调用方法本身方法体,同时 将dog 传给方法里的 this 

            string returnValue = method.Invoke(dog, null).ToString();

 

            //1.1获取重载的方法时,要传入 形参列表类型数组

            MethodInfo method12 = dogType.GetMethod("Bark", new Type[2] { typeof(string),typeof(int) });

            string returnValue12 = method12.Invoke(dog, new object[1] { "金毛巡回猎犬" }).ToString();

 

            //2.调用静态方法:

            //获取 Dog类里的 Bit 方法对象

            MethodInfo method2 = dogType.GetMethod("Bit");

            //通过方法对象 调用静态方法本身方法体,不需要为 this 传参!

            string returnValue2 = method2.Invoke(null, null).ToString();

 

            //调用带参数的 静态方法

            //获取 Dog类里的 Bit2 方法对象

            MethodInfo method3 = dogType.GetMethod("Bit2");

            //通过方法对象 调用静态方法本身方法体,不需要为 this 传参!

            string returnValue3 = method3.Invoke(null, new object[2] { "中国", "美国" }).ToString();

        }

 

        //------------------------------------------------------------------

        /// <summary>

        /// 1.0 通过激活器创建 对象

        /// </summary>

        private void btnCreateInstance_Click(object sender, EventArgs e)

        {

            //1.1通过激活器 根据类型 创建 对象

            Type dogType = typeof(Dog);

            //缺点:只能调用无参的构造函数!

            Dog dog1 = Activator.CreateInstance(dogType) as Dog; //相当于 new Dog();

 

            //1.2通过程序集 创建 程序集里某个类 的对象

            //Assembly ass = Assembly.LoadFrom(@"F:\03.Net\DotNet13\反射\Code\S01反射\S01反射\bin\Debug\S02MODEL.dll"); //Assembly.GetExecutingAssembly();

             程序集 根据提供的类名 找到 程序集里的类型,并 创建对象

            //object dog2 = ass.CreateInstance("S02MODEL.Dog") as Dog;//其实 内部 也调用了 Activator.CreateInstance

        }

 

        object CreateAObj(Type type)

        {

            return Activator.CreateInstance(type);

        }

 

        /// <summary>

        /// 2.0 通过构造函数 创建 对象

        /// </summary>

        private void btnConstructor_Click(object sender, EventArgs e)

        {

            Type dogType = typeof(Dog);

            //根据构造函数形参 的类型 个数,获取 指定的构造函数对象

            ConstructorInfo cons1 = dogType.GetConstructor(new Type[1] { typeof(string) });

            //通过构造函数创建对象

            Dog dog = cons1.Invoke(new object[1] { "大黄~" }) as Dog;

 

        }

 

        //-------------------------------------------------------------------

 

        /// <summary>

        /// 1.0 获取私有成员

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btnGetNonPublick_Click(object sender, EventArgs e)

        {

            Dog dog = new Dog("小白2",true);

            Type dogType = dog.GetType();

            //获取 非公有的 实例成员

            FieldInfo gender = dogType.GetField("gender",BindingFlags.Instance | BindingFlags.NonPublic);

            //dogType.GetMethod("Bark", BindingFlags.Instance | BindingFlags.NonPublic);

            bool genderBool = Convert.ToBoolean(gender.GetValue(dog));

        }

    }

}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值