C#反射是什么?概念+代码

//反射是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型
	//(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。
	//有了反射,即可对每一个类型了如指掌,如果获得了构造函数的信息,即可直接创建对象
	class Program
    {
        //反射可以看到类的属性和方法,设置和获取属性值,调用方法
        //    {   GetProperties  获取属性
        //Type      
        //    {   GetMethods     获取方法
        //
        //                  {   GetValue(实例)
        //属性 ProPertyInfo       
        //                  {   SetValue(实例,值)
        //
        //方法 MethodInfo    invoke(实例,参数)
        //
        static void Main(string[] args)
        {
            Stu s = new Stu() { Name = "占山" };
            Stu s2 = new Stu() { Name = "王五" };

            Type t = s.GetType();

            //获取所有属性名称
            var ps = t.GetProperties();
            //获取所有方法名称
            var ms = t.GetMethods();

            //显示属性
            foreach (var i in ps)
            {
                Console.WriteLine(i.Name);
            }

            Console.WriteLine("-----------------------");
            Console.WriteLine("-----------------------");

            //显示方法  前面两个是只读和只写的两个方法,第三个是咱们定义的方法,后面四个是继承自Object的方法
            foreach (var j in ms)
            {
                Console.WriteLine(j.Name);
            }
            Console.WriteLine("-----------------------");
            Console.WriteLine("-----------------------");

            //给第一个学生赋值
            ps[0].SetValue(s, "里斯");
            //读取值
            Console.WriteLine(s.Name);
            
            //获取第二学生的姓名
            Console.WriteLine(ps[0].GetValue(s2));

            Console.WriteLine("-----------------------");
            Console.WriteLine("-----------------------");

            //调用方法,第一个值是学生信息,第二个是方法参数,没有参数就传null
            ms[2].Invoke(s, new object[] { "Hello","World"});

            Console.Read();
        }

        //学生类
        class Stu
        {
            public string Name { get; set; }

            public void Say(string a1, string a2)
            {
                Console.WriteLine(a1+" "+a2);
            }
        }
        
		//动态加载dll文件
        static void Main(string[] args)
        {
            // 路径E盘下的dll文件
            Assembly a = Assembly.LoadFile(@"e:\ClassLibrary1.dll");
            //获取所有类型
            //Type[] atypess = a.GetTypes();
            //foreach (Type t1 in atypess)
            //{
            //    Console.WriteLine(t1);
            //}

            //类型全名
            var s = a.CreateInstance("ClassLibrary1.Stu");
            //类型全名
            Type t = a.GetType("ClassLibrary1.Stu");
            //要获取的属性名
            var name = t.GetProperty("Name");
            var age = t.GetProperty("Age");
            //赋值
            name.SetValue(s, "张三");
            age.SetValue(s, 19);

            //获取方法
            MethodInfo m = t.GetMethod("Say");
            //调用方法,传入对应参数
            m.Invoke(s,new object[] { "晚上"});


            Console.ReadKey();
        }
    }

发布了43 篇原创文章 · 获赞 35 · 访问量 1592

猜你喜欢

转载自blog.csdn.net/qq_45244974/article/details/103598271