【讨论】反射原理悟不透,大家指点下

yingyuebingya 2010-04-15 03:43:18

最近在看底层,在BLL层有个方法接受三个参数,一参为带命名空间的类名,二参为方法名,三参为方法的参数。

然后根据一参用反射实例化出一个DAL层的类,再用该类调用二参和三参。返回结果。

大概看懂了,可反射第一次接触,搞不懂。

概念我看msdn了,还是理解不了。

那位说下原理,头哈大...

PS:既然反射可以跨命名空间完成对象实例化了,那对象的封装意义又何在?
...全文
357 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yingyuebingya 2010-04-15
  • 打赏
  • 举报
回复

谢谢 ly302 ,讲的好详细,例子也很帅: )
皇城龙三 2010-04-15
  • 打赏
  • 举报
回复
关于反射层次模型中的第三个层次:类型反射

给你一个简单的利用反射获取类型信息的例子:

using system;

using sytem.reflection;

class reflecting

{

static void Main(string[]args)

{

reflecting reflect=new reflecting();//定义一个新的自身类

//调用一个reflecting.exe程序集

assembly myAssembly =assembly.loadfrom(“reflecting.exe”)

reflect.getreflectioninfo(myAssembly);//获取反射信息

}

//定义一个获取反射内容的方法

void getreflectioninfo(assembly myassembly)

{

type[] typearr=myassemby.Gettypes();//获取类型

foreach (type type in typearr)//针对每个类型获取详细信息

{

//获取类型的结构信息

constructorinfo[] myconstructors=type.GetConstructors;

//获取类型的字段信息

fieldinfo[] myfields=type.GetFiedls()

//获取方法信息

MethodInfo myMethodInfo=type.GetMethods();

//获取属性信息

propertyInfo[] myproperties=type.GetProperties

//获取事件信息

EventInfo[] Myevents=type.GetEvents;



}

}

}
皇城龙三 2010-04-15
  • 打赏
  • 举报
回复
反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

反射的作用:

1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现 有对象中获取类型

2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。

3. 反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

应用要点:

1. 现实应用程序中很少有应用程序需要使用反射类型

2. 使用反射动态绑定需要牺牲性能

3. 有些元数据信息是不能通过反射获取的

4. 某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的

wujinjian2008n 2010-04-15
  • 打赏
  • 举报
回复
学习.......
yingyuebingya 2010-04-15
  • 打赏
  • 举报
回复

谢谢 jietuan ,看来症结就在元数据了。

结贴去看msdn 和 cnblogs 了,谢谢大家:)
porschev 2010-04-15
  • 打赏
  • 举报
回复
学习......似懂非懂...
jietuan 2010-04-15
  • 打赏
  • 举报
回复
其实反射很简单,你理解元数据吗?在dll,exe里面存储了module和元数据,反射就是根据元数据和module在内存内面帮生成类。
yingyuebingya 2010-04-15
  • 打赏
  • 举报
回复

谢谢 ff167 ,以前都是一个个绑的,看完反射后,看能不能理解你说的这个应用。

谢谢 wanghui0380 ,rtti 和 帖子 我都会去看的。你提到的那两本书,还真的没看过
yingyuebingya 2010-04-15
  • 打赏
  • 举报
回复

谢谢 vrhero 和 dragonforfly ,就是想弄懂反射,可不知从何下手。“元数据”---原来是这个。

谢谢 高歌 ,反射的代价是性能。怪不得 vrhero 说不是万能膏药。

谢谢 guilipan ,你的意思是说反射的灵活性就在于完全去除了耦合吗?
wanghui0380 2010-04-15
  • 打赏
  • 举报
回复
基本概念问题

1.请先弄明白:运行期延迟RTTI(run-time type identification),元编程 的概念

2.去博客园看 冒号课堂 看元编程与常规编程的区别
http://www.cnblogs.com/xyz98/archive/2009/04/01/1427549.html

3.去博客园看 老赵的一篇吵架帖
http://blog.zhaojie.me/tag/%E5%8F%8D%E5%B0%84/
呵呵虽然是吵架帖,不过也不乏真知识

ps:要理解反射的概念,rtti和元数据编程是避不了的。可以说net框架整个的核心就是架构在type类型的元数据管理上(这个可以看《.net框架设计:CLR via c#》 或者《你必须知道的.net》)
ff167 2010-04-15
  • 打赏
  • 举报
回复
反射可以减轻很多工作量,对于一堆对象,你可能知道他们里面的所有方法和所有属性了,但是要一个个方法和属性去写调用方法可能会累死人的。直接反射出来调用的话代码就可以减少很多了。

举例:一个网站系统,你写一个basepage,通过反射出传入的包括数据的对象的所有属性,然后根据这些属性就可以绑定相应页面里的控件。如果不利用反射,就要一个个属性对应控件慢慢的绑……

当然这个只是一个应用而已。不能什么都往上套。
Alden 2010-04-15
  • 打赏
  • 举报
回复
对于.net源代码编写的类,直接查看成员的信息就能确定其类型。当源代码被编译为组件后,获取其类型属性仍很重要,有可能组件要作为Web service在因特网上传送.
.net组件中内置了元数据,其包含了成员的许多重要属性的详细描述,在运行时获得元数据的过程叫反射。
说简单点,给你一个类名,你就能使用元数据或者这个类的成员属性和方法。
amandag 2010-04-15
  • 打赏
  • 举报
回复
动态创建对象,调用方法的优点是灵活,代价是性能
vrhero 2010-04-15
  • 打赏
  • 举报
回复
想搞清楚原理先去搞清楚“元数据”和“程序集”的概念...MSDN上都有...
guilipan 2010-04-15
  • 打赏
  • 举报
回复
反射提供了一种能够在运行时仍然能够灵活调度的手段,相比你在编译时就确定的代码逻辑,反射更灵活。封装只是一种将相同属性和行为的对象的一种抽象。问题是你永远不能100%确定你所封装的对象永远不会改变,相当与只能减少耦合,而不能完全去除耦合一样
vrhero 2010-04-15
  • 打赏
  • 举报
回复
反射是为无法控制源代码的场景和某些无法通过正常途径完成的场景而准备的,不是让你当万能膏药用...

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧