C#中如何理解【反射】技术
类别:DotNet阿里妈妈帮你实现网络赚钱梦
看了好几本书,但总是看到反射这里犯了迷糊没信心看下去!
不知道各位用一些比较通俗易懂的语言来讲讲反射的原理,反射的应用等等一切和反射有关的技术。
如果分不够,可以在补!谢谢!
问题点数: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
学习
怎样将窗体中TextBox的内容,作为SQL中的条件在水晶报表中显示。。。
mms和ftp的困惑?
过年了,散分~~~~~~~~~~~~~
急!!!关于windows主题改变,无边框窗口外观的变换情况
散分,IT人的未来,来者有分 (2)
打包后水晶报表无法导出pdf
TreeView一操作就消失了
请教关于webservice wsdl关于port name设置的问题?
vs.net2005报表问题
新建.NET技术交流群7422818,朋友们进来共同学习啊!
求助,AxMediaPlayer控件??怎么实现文件播放一次后,关闭窗体???
rdl子报表导出问题
求助!CList模板类的用法
有喜欢摄影的兄弟姐妹没?来欣赏照片,顺便接分咯!
如何在web service 的两个方法保存加密对象
高手請幫忙,WorkFlow foundation 里如何動態加載 parallel流程中分支(急)
学习 .net迷惘中 各位给点建议啊。
treeview问题,各们高手进来指导一下,
VC .NET与VC 6.0的区别,我该学哪个?????
请大家推荐一款好用的.net上面的换肤软件