A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩继新 中级黑马   /  2013-9-30 08:29  /  1311 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 韩继新 于 2013-10-1 19:13 编辑

网上看了些讲解反射的,写的好长,看完了还是不清楚反射是怎么回事?
希望可以通俗的给我讲解下,什么是反射、什么情况下用反射、反射有什么优点。最好加上简单易懂的小例子哦

3 个回复

正序浏览
本帖最后由 段朝骞 于 2013-9-30 12:59 编辑

某位大神说过:反射就是操作元数据
通过反射可以读取封装类中的方法,属性等,可以不使用new关键字
最利害的是可以直接使用类中的私有字段,方法等
  1. <div class="blockcode"><blockquote>using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;

  6. namespace 反射1
  7. {
  8.     class Program
  9.     {
  10.         class People
  11.         {
  12.             private string name="李斯";
  13.             private void Say()
  14.             {
  15.                 Console.WriteLine("hello"+name);
  16.             }
  17.         }
  18.         static void Main(string[] args)
  19.         {
  20.             Type typ = typeof(People);
  21. //反射出name字段
  22.             FieldInfo fi = typ.GetField("name",BindingFlags.Instance|BindingFlags.NonPublic);  
  23. //反射出Say()方法
  24.             MethodInfo me = typ.GetMethod("Say",BindingFlags.Instance|BindingFlags.NonPublic);
  25. //创建obj实例
  26.             object obj = Activator.CreateInstance(typ);
  27. //设置name字段
  28.             fi.SetValue(obj,"张三");   
  29. //调用Say()方法
  30.             me.Invoke(obj,new object[]{}); //打印出结果 hello张三
  31.             Console.ReadKey();
  32.         }
  33.     }
  34. }
复制代码
回复 使用道具 举报
面向对象中存在一个封装的概念,也就是说,你需要构建一个封装体的实例(类或对象),然后呢,你才可以访问这个封装体封装的方法、属性等等,但是使用反射,你可以不需要构建这个封装体的实例,你就可以知道这个封装体是个什么类型的东西,并且可以看到这个封装体里面封装了什么样的方法、属性等等
回复 使用道具 举报
本帖最后由 曹伟 于 2013-9-30 08:54 编辑

个人肤浅理解,
反射实际上就是得到程序集中的属性和方法
在设计模式中应该会用到反射技术实现步骤:
导入using System.Reflection;
Assembly.Load("程序集") //加载程序集,返回类型是一个Assembly
   foreach (Type type in assembly.GetTypes())
            {
                string t = type.Name;  //   得到程序集中所有类的名称
            }
Type type = assembly.GetType("程序集.类名");  //获取当前类的类型
Activator.CreateInstance(type);  //创建此类型实例
MethodInfo mInfo = type.GetMethod("方法名"); //获取当前方法
mInfo.Invoke(null,方法参数);  

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马