C#中使用反射的意义?为什么要使用反射

zhang_meixia 2012-07-26 09:04:20
最近在看反射,始终不明白为什么要用反射?比如说我有个person.dll,我不引用它,我通过反射获取其类型,然后创建对象进行实例化,再通过反射查看该类型的方法,再调用其方法。但是,我可以直接添加person.dll的引用,这样,就不用那么麻烦了,直接可以实例化,可以调用对象的方法?

新手上路,还请各位帮忙。
...全文
2209 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveSoftandhxy 2012-07-26
  • 打赏
  • 举报
回复
你直接引用DLL,那是静态的,一旦改变DLL,就必须重新编译

如果使用反射,在框架中作用很大,就负责配置好DLL,可以动态的加载。不过一般没啥必要,个人觉得,不要用,毕竟性能肯定是有影响
qldsrx 2012-07-26
  • 打赏
  • 举报
回复
C++里面没有反射,因此C++为了让编译器能够产生各种内置类(例如MFC)的语法提示,就必须带有头文件(类型定义)才行,这样十分麻烦,而C#则不需要,因为有反射,只要有dll就可以使用。对一个未知的dll,不使用反射根本不知道内部有些什么,即使你编程的时候很方便的通过点好访问dll内部成员了,但是那个是因为编译器帮你反射后的结果,没有反射,你的智能语法提示将不可用。
种草德鲁伊 2012-07-26
  • 打赏
  • 举报
回复
比如动态地加载程序集,实现插件机制,用attribute实现aop等等..

http://msdn.microsoft.com/zh-cn/library/f7ykdhsy
a1063266881 2012-07-26
  • 打赏
  • 举报
回复
我一般都是为了分离数据层与其他层之间的耦合才用的反射,而且可以隐藏数据层的结构
a1063266881 2012-07-26
  • 打赏
  • 举报
回复
我一般都是为了分离数据层与其他层之间的耦合才用的反射,而且可以隐藏数据层的结构
mizuho_2006 2012-07-26
  • 打赏
  • 举报
回复
同意4L。
effun 2012-07-26
  • 打赏
  • 举报
回复
因为你还是个新手,所以确实反射对你没什么意义,等将来你接触得多了,就会自然想到要用反射了。其实,不管反射有没有意义,你已经在不自觉地使用它了,举个最简单的例子,当你在VS的设计器里拖入一个控件后,设计器会通过反射获取这个控件的属性,并提供你进行设置,那么,为什么要用反射呢?因为设计器在做的时候,根本不可能预知将来有什么东西会在它的身上躺着。
色拉油 2012-07-26
  • 打赏
  • 举报
回复
看看设计模式工厂方法反射实现就明白了

很多时候编程的时候我不知道有多少类,或者类名(得益于傻逼客户的需求变化),但我也不能耗着不编,或者不断该代码,这时候就能用反射了
  • 打赏
  • 举报
回复
    Assembly ass = Assembly.LoadFrom(@"F:PaipaiBaAJAXWebSitebinCustomControls.dll"); 
    Module[] mods = ass.GetLoadedModules();
    Type t = ass.GetType("CustomControls.MathUtil");
    object obj = System.Activator.CreateInstance(t);
    Type[] paramTypes = new Type[2];
    paramTypes[0] = System.Type.GetType("System.Double");
    paramTypes[1] = System.Type.GetType("System.Double");
    MethodInfo med = t.GetMethod("Sum", paramTypes);
    object[] parameters = new object[2];
    parameters[0] = 5d;
    parameters[1] = 4d;
    object objRetval = med.Invoke(obj, parameters);
  1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型

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

  3. 反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能
  • 打赏
  • 举报
回复
反射一般情况下用不到,但是为了应对负责的业务变化确实是有效地。
例如你有个main.exe,需要使用say.dll,draw.dll,突然客户说我们要添加一个跑的功能,那么只需要按照我们约定的规约做一个run的dll,之前的main.exe不需要做任何修改(就是不需要再去导入run.dll,其中需要其他的设计来规范),在main.exe中就能直接使用run.dll了
zhang_meixia 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
最近在看反射,始终不明白为什么要用反射?比如说我有个person.dll,我不引用它,我通过反射获取其类型,然后创建对象进行实例化,再通过反射查看该类型的方法,再调用其方法。但是,我可以直接添加person.dll的引用,这样,就不用那么麻烦了,直接可以实例化,可以调用对象的方法?

新手上路,还请各位帮忙。
[/Quote]

具体能讲个例子,我还没有概念什么时候会用到反射
cheng2005 2012-07-26
  • 打赏
  • 举报
回复
反射就是为了进行一些反OO的设计。我个人极度不推荐反射,我的观点是良好的设计可以避免反射,当然我指的是架构层面,而不是功能层面。某些功能确实需要反射,或者说反射会省掉一些硬编码,这种情况我才会使用反射。
还有一个值得注意的地方,如果你想在架构里使用反射,最好把反射的次数固定为1次,或者为可控制的几次。那种底层方法不停的用反射进行处理 的架构 真是弱爆了!
Ki1381 2012-07-26
  • 打赏
  • 举报
回复
一个可能的例子就是插件

110,539

社区成员

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

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

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