C#中如何理解【反射】技术

类别:DotNet

阿里妈妈帮你实现网络赚钱梦


楼主LEOlws(殴打恐龙)2006-08-26 18:35:43 在 .NET技术 / .NET Framework 提问

看了好几本书,但总是看到反射这里犯了迷糊没信心看下去!  
      不知道各位用一些比较通俗易懂的语言来讲讲反射的原理,反射的应用等等一切和反射有关的技术。  
      如果分不够,可以在补!谢谢! 问题点数:100、回复次数:53

1 楼qzh1119(大浪淘沙)回复于 2006-08-26 18:42:01 得分 0

支持,与你一样的感觉!

2 楼MyLf(不睡觉的鱼)回复于 2006-08-26 19:33:00 得分 0

你这话题就大了,你看了好几本书都没明白,我们说的你也不会明白,毕竟我们也是从书本上学的.  
   
  其实就是运用程序集元数据的功能,在运行时查询元数据.

3 楼hunbei_005()回复于 2006-08-26 22:01:31 得分 0

顶!  
   
  另外,推荐两个Flash游戏,玩玩,挺有意思!  
  (我自己业余时间写的网站,大家看看给点意见,谢谢啦!)  
  【偷看洗澡美女】很简单,把泡沫挪开,然后可以看到。。。。。  
  http://www.hunbei.com.cn/flash/flash_play.asp?id=3363  
  【透视眼镜】  
  http://www.hunbei.com.cn/flash/flash_play.asp?id=3317  
 

4 楼Yellow198267(才高七八斗,学富五六车,改行三四次,月入一两千!)回复于 2006-08-26 22:10:53 得分 0

动态查询元件状态吧.

5 楼lxhvc(lxhvc)回复于 2006-08-26 22:55:24 得分 0

楼主需要先理解.net运行时和元数据才能比较好理解反射。

6 楼yan63(silence like a cancer grows)回复于 2006-08-26 23:21:24 得分 0

看了消费黄页,下班后狂奔xx路x号大排档叫碗牛肉面,这样是反射,  
  后来发现钱没带,不等上菜偷溜回家,和平时一样在厨房煮开水配咸菜那就是一般调用了

7 楼fds2003(Hunter)回复于 2006-08-26 23:31:46 得分 0

UP

8 楼Dennis_maomao(大熊猫)回复于 2006-08-27 11:14:44 得分 0

帮顶

9 楼amandag(高歌)回复于 2006-08-27 11:28:34 得分 20

对于用我们所熟悉的C#源代码编写的类,通过查看方法头或相关类定义中的变量声明,我们很容易确定其类型。当我们的源代码成为一个被外界使用的组件,判断类型属性仍很重要(也许我们的组件为一个数据库提供数据或与组件交换数据,且此组件用于C#语法和配置不同的计算机语言编写而成,甚至我们的组件要作为WEB服务在因特网上传送)。  
          为使我们的组件能以一种灵活、用户友好的方式描述类型,从而与不同的应用环境无缝集成,我们使用到了C#中内置的元数据(编译器自动将相关元数据发送到一个程序的功能),元数据包含了方法、实例变量和程序中每个类型许多其他重要性质的详细描述(类型的名字),而在运行时根据程序集及其中的类型得到元数据的过程就叫反射(Reflection)。

10 楼HipHop_VS_Cpp()回复于 2006-08-28 18:13:10 得分 20

你首先要理解一下概念:  
  一   类型(Type)   对象是什么  
        比如   object   x;   x是对象,object就是它的类型,在程序中如何描述类型这个概念呢?就是Type(System.Type)。要获取某个类的类型可以用typeof()操作符  
        object   a;object   b;  
        DataTable   t;  
   
        Type   aType   =   typeof(object);Type   bType   =   typeof(object);tType   =   typeof(DataTable);  
        aType==bType!=tType;  
   
  二   程序集(Assembly)  
        就是你IDE生成的.exe或.dll文件的运行时就叫程序集。所有的代码都在程序集中。你可以通过Assembly.Load()系列函数动态加载程序集(这一步是动态+载代码的前提,因为所有的代码都在程序集中)。  
   
  三   动态加载  
        我们普通调用代码是:   对象名.方法名(参数列表);  
        class   a{    
            void   func(int   x){}  
            public   static   void   Main(string[]   args)  
            {  
                      //创建对象  
                      a   a1   =   new   a();  
                      //调用函数  
                      a1.func(1);  
            }    
        }  
        用反射动态调用代码是  
        //加载程序集  
        System.Reflection.Assembly   asm   =   Assembly.LoadFile(assemblyPath);  
        //获取类型  
        Type   aType   =   asm.GetType("名字空间.类名");  
        //获取没有参数的构造函数  
        System.Reflection.ConstructorInfo   conn   =   t.GetConstructor(new   Type[0]);  
        //调用没有参数的构造函数,Invoke返回object它其是a类  
        object   a1   =   conn.Invoke(new   object[0]);  
        //获取参数类型为int,函数名为func的方法  
        MethodInfo   method   =   t.GetMethod("func",new   Type[]{typeof(int)});  
        //在a1上调用func方法,参数为1  
        method.Invoke(a1,new   object[]{1});  
   
        动态调用(后一种方法)比静态调用更复杂,而且效率大概低20倍(网上有个哥们好像测试过)。只有在特殊的时候才调用动态加载动态调用---比如,你的主程序启动的时候子模块还没有,要根据登陆信息下载子模块代码并调用子模块代码,就只能用动态+载来实现了.  
         
  四   元数据  
        .net生成的IL代码中标明了在这个(exe,dll)文件中所有的class(类)   method(方法)Attribute(属性)   Property(类属性)的签名和调用方法信息,这些信息就叫做元数据。所谓的Reflection反射,就是利用元数据,可以了解到某个assembly(基本等同文件)中的class。。。。。   (就是上面那一串咚咚)信息和调用方法。  
   
  五   .net   framework  
        在.net   framework中反射类基本都在System.Reflection中。System.Type是反射的核心类.  
  与它相关的还有System.Attribute命名空间。  
   
        以上是我对Reflection的理解,请高手不吝赐教啊  
   
 

11 楼fengyeng(在城里飘~~~~)回复于 2006-08-29 09:06:16 得分 0

mark

12 楼marysxj(走自己的路,让别人打的去吧!)回复于 2006-08-29 10:59:27 得分 0

关注学习中...  
  近期要用到反射,好好学习。。。

13 楼shuo_shu(取个名字还真难)回复于 2006-08-29 14:30:32 得分 0

所谓,   反射,   就反着方向射出去。  
   
  实用点,   就给给你一个类的全限定名,   你就能使用这个类里面的所有东西了。  
   
  如果不是反射,   就是正方向射出去  
  就是用new在程序运行的时候就告诉内存我要使用这个东西了

14 楼rib06(诸刃突袭·掌上的明珠)回复于 2006-08-29 20:20:46 得分 0

我们老师是这样比喻的:对一个.net程序集投过去一束光线,就可以得到它里面的类的信息、类中属性、方法以及方法的参数和返回值的信息就可以“反射”出来。  
   
  反射的本质就是对程序集元数据的分析,也只有这种带有元数据的程序集(比如.net程序集或JavaBeans)才能够被“反射”

15 楼make11111(孙少平)回复于 2006-08-29 21:30:03 得分 0

Mark

16 楼cbo5()回复于 2006-08-30 10:41:12 得分 0

你需要扳手,我就给你扳手  
  你需要钳子,我就给你钳子  
  只要能满足你的需求,你也就不在乎它们是红的或是黄的;  
  突然某天你很想知道,回头看的时候,发现它们是绿的。  
   
  之所以称为“反射”,就是因为你看到的只是它们的影子!(也就是interface)

17 楼chenxsh2615(会飞的猪)回复于 2006-08-30 10:55:07 得分 0

留抓印

18 楼Jeff_info(Jeff)回复于 2006-08-31 10:38:33 得分 0

关注、学习!

19 楼sozdream(Dream.Zhang)回复于 2006-08-31 10:53:15 得分 0

反射我认为还是比较直观,MSDN的例子也很清楚..  
   
  难理解的是MSDN上的Security,   COM ,   理论超超多,   例子超超简单,   不知道在讲什么.

20 楼Kshatriya(何以解忧,惟有杜康)回复于 2006-08-31 12:29:52 得分 0

知道怎么使用就可以了,深入理解实现的机制不是必要的

21 楼MonkWang(象写情书一样写程序)回复于 2006-08-31 12:47:58 得分 0

反射说白了就是不直接new出类来!可以通过字符串的形式来生成这个类!之后如果想改变这个类的时候只要通过XML改变这个字符串就可以了!  
  相对来说反射比new出类来要麻烦许多,代码也多很多!但换来的是程序的可扩展性及高效的维护性!  
  但如果你是一个小的系统,有没有那么多扩展,使用反射反而麻烦学多!  
  我也是刚看这方面的资料,学了点这方面的知识!  
  拙见,只供参考!

22 楼wxwinter()回复于 2006-08-31 13:11:55 得分 0

通俗一些讲:  
   
  VB曾有这样一个功能:(我用C#描述一个)  
   
  //////////////////////////////////////  
  object   obj;  
  textBox   t   =   new   textBox();  
   
  obj=t;  
   
  obj.Text="1234";  
  //////////////////////////////////////  
  C#与VB.NET为了实现就使用了返射  
   
  ---------------------------------------------------  
  Assembly.LoadFile叫后期绑定  
  在VB中是CreateObject函数  
   
  CreateObject函数有一个参数可以调用远程主机的DLL,该技术叫DCOM,在NET用Remoting实现  
   
   
   
 

23 楼nacarat()回复于 2006-09-01 10:02:29 得分 0

我就说一句,lz学过C 吗,  
  由于反射表示的是程序的本体,所以反射就是.net平台的RTTI。

24 楼imdg(imdg)回复于 2006-09-01 10:56:36 得分 0

我觉得把Reflection翻译为“反映”要比“反射”要恰当一些  
   
  这个技术无非就是在运行时查询、操作元数据  
  所谓元数据就是一种跟C 里头文件里记的东西差不多的东东

25 楼doitnow2000(大海)回复于 2006-09-02 16:27:32 得分 0

这个东东太广泛了。  
   
  简单的说,就是从一个对象的Type类型中找到你所定义这个类的一切信息,如类的方法、属性等。

26 楼Mijie_John()回复于 2006-09-02 16:40:41 得分 0

你看的什么书啊?看看<NET框架程序设计>然后多用用就应该会了。

27 楼cybermat()回复于 2006-09-02 19:39:52 得分 0

mark

28 楼pyuan(菜鸟)回复于 2006-09-02 22:59:09 得分 20

我最近用到的一个应用反射例子就是这样的  
  我有多个类,用来存贮数据,每个类有多个属性,其中有些属性是必需的,而有些是可选的。每个类,我都需要检查一下,必需的属性是否为空值。  
  于是我的做法是把这些类全继承自一个DataBase基类,而这个基类实现一个方法,通过反射查询类所有的属性,先判断属性是否有一个自定义的NotNullAttribute,如果有则通过反射查询这个属性的值是否为空,为空则返回false  
   
  这样,我的类只要继承自DataBase类,同时在不为空的属性上面加上[NotNull]就可以了  
   
  这样子还是很方便的,我不用为每个类去写一个验证函数了

29 楼greennetboy(我的老婆叫静静)回复于 2006-09-03 10:28:09 得分 0

http://www.cnblogs.com/jillzhang/archive/2006/08/10/473326.html

30 楼bejon(阿牛[如果我懂,必坦诚相告;如果您懂,请不吝赐教。])回复于 2006-09-03 10:38:36 得分 0

先跳过,等我有一定水平再看。以前用vb6的时候没反射也干了很多事

31 楼fancystyle(鳞)回复于 2006-09-07 00:38:09 得分 0

mark  
  我也刚看,我的理解是,面对一个黑盒一样的类库,用反射的作用就是反推达到其方法,知道这个类的作用等,对吗?

32 楼dlzhangln(才高七八斗,学富五六车,改行三四次,月入一两千!)回复于 2006-09-07 13:48:32 得分 0

我来接分

33 楼cm4ever(小P[Fly Away])回复于 2006-09-07 17:06:00 得分 0

反射就是按名调用,比如对于类MyClass的MyMethod静态方法,一般这样用  
   
  MyClass.MyMethod();  
   
  对应反射则是  
   
  Type   type   =   Type.GetType("MyClass");  
  type.GetMethod("MyMethod",   null).invoke(null,   null);

34 楼www_123du_com(鼠·神·泪)回复于 2006-09-07 17:10:39 得分 0

运行时获取其元数据

35 楼P908(华D)回复于 2006-09-07 22:31:24 得分 0

元数据是反射机制,甚至.NET   Framework的基石

36 楼zhuixue()回复于 2006-09-08 17:00:17 得分 0

学习

37 楼alby(批发各种型号黄瓜)回复于 2006-09-08 17:42:17 得分 0

父类不知道子类的存在,  
  获取子类的信息就用反射  
   
  撇开元数据这样来理解不知道对不对

38 楼wshuangminlg(这里有你想要的 http://31767702.qzone.qq.com/)回复于 2006-09-11 14:02:33 得分 0

<NET框架程序设计>   看看

39 楼Miracle(新一代的开山怪)回复于 2006-09-12 09:45:23 得分 0

nacarat()   (   )   信誉:100         Blog     2006-9-1   10:02:30     得分:   0      
           
  我就说一句,lz学过C 吗,  
  由于反射表示的是程序的本体,所以反射就是.net平台的RTTI。  
   
  ============  
   
  nacarat说的好,反射就相当于以前C /Delphi的RTTI系统的更加成熟的版本。  
   
       
     
 

40 楼zeng_c_h(不喜欢Coding的程序员)回复于 2006-09-12 15:28:35 得分 0

樓上几個大哥說的好呀,學習,謝拉

41 楼Miracle(新一代的开山怪)回复于 2006-09-13 17:02:40 得分 20

ok,我们写代码,是面向功能的,比方说,   Math.Add(x,   y)返回x   y之和。但是有时候我们希望给代码附加一些特殊属性,而这些属性可能跟功能关系不大。比方说,我们希望Math.Add()能够作为Web服务的方法被调用。为了解决这个问题,.NET就提出Attribute(属性)概念,你可以写  
  [WebMethod]  
  public   int   Add(int   x,   int   y)  
  {  
  //...  
  }  
  这样编译器在编译Add方法的时候,同时也会把[WebMethod]这个附加的属性也生成并注入到编译结果(程序集)的特定区域,我们称它为元数据区域。这样ASP.NET就可以在运行时扫描属性数据,识别各种Web方法并产生正确的WSDL文档。属性就是一种元数据(所谓元数据,就是描述数据的数据)。其他的元数据包括类型列表,继承关系,接口列表,等等……  
   
  光生成和存储是不够的,我们还要能读取识别元数据,反射就可以干这个,在运行时反射系统可以允许你读取所有的元数据并加以利用(比如,找到一个类的集成树)……  
   
  这么说,够明白了吧。元数据是描述程序集内部数据的词典,反射是帮你查词典的工具。

42 楼Csharp110(~泰山~)回复于 2006-09-21 10:33:42 得分 0

up

43 楼xiao_p(kkk)回复于 2006-09-22 15:19:36 得分 0

哥们,其实  
  说白了反射贼简单  
   
  我们无论写什么程序,。net都是用元数据加以说明  
  这些元数据就和注释是的帮助。net识别这些代码  
   
  而我们就可以通过元数据调用加载  
  这就是反射

44 楼xiao_p(kkk)回复于 2006-09-22 15:23:48 得分 0

举个简单的例子  
   
  你有个名字   叫做王二  
   
  当我知道你在哪里的时候,我调用你,这个就是直接调用  
   
  但是,有一天,我不知道你或者说我找不到你了,  
   
  于是我就只好变通的找到你,比如你用的名字王二找你  
   
  这个过程就是反射了

45 楼xiao_p(kkk)回复于 2006-09-22 15:24:23 得分 0

而元数据就是上面的王二,大概就是这么个意思  
   
  呵呵

46 楼aafshzj(生活需要breakthrough)回复于 2006-09-22 15:29:37 得分 20

对于你的问题,我的答案是跳出你的问题本身的。  
   
  关键在于你要用reflection来干什么?如果目前没什么用,我建议你大概知道Reflection提供了一种动态的可编程的办法让你能够了解任何程序集、对象类型的结构、方法、属性等就够了。  
   
  你用不到的东西学了也是白学,了解一点是可以的,但不必花太多时间。只要你遇到相关问题了知道该用这个就够了,到那时候你才会明白为什么要这样为什么要那样了。任何软件都是设计来解决某些人的具体问题的。你没问题就永远不会理解为什么要那样解决。  
   
  记住我的话:你用不到的东西学了也是白学,因为你不但学得不知其然,忘得也将会不知其所以然。  
   
   
  一点浅薄意见,希望对你有所帮助。  
   
   
   
   
  欢迎大家来我的博客作客:http://blog.csdn.net/aafshzj/  
  我正在写一系列关于AAF组件框架的文章。该框架能对开发工作提供很多帮助,并极大地提高开发效率。希望大家看一看并提出宝贵建议。  
 

47 楼gngnandgngn(仗义执言 )回复于 2006-09-25 15:40:18 得分 0

晕,   看了好几本书都没看懂啊。。。有这么难吗?

48 楼iflang(踩姑娘的小蘑菇)回复于 2006-09-25 15:50:53 得分 0

Mark

49 楼free_wang()回复于 2006-10-11 20:54:53 得分 0

反射原理

50 楼tiaa666(麦兜)回复于 2006-10-15 15:34:34 得分 0

Mark,学习中~~~

51 楼linhaiqiang(不倒翁)回复于 2006-10-16 16:22:12 得分 0

船到桥头自然直

52 楼icefire703()回复于 2006-10-17 14:29:12 得分 0

运行中的状态吧

53 楼BSC(VirtualCat)回复于 2006-10-20 15:26:28 得分 0

mark

54 楼xjtandqt(重在参与)回复于 2006-10-20 18:40:17 得分 0

学习

↓有缘文章(随机)
返回[就爱你]首页