C# 为什么要用反射,什么情况必须使用反射。

问题描述

DLL内容都了解的话,直接引用DLL不就好了吗,为什么还要反射。DLL里面的内容什么都不知道的话,就算反射的话,也不知道里面的方法是干什么的啊,和直接引用DLL没区别啊。有的说工厂模式动态加载DLL时需要用到反射如果我不用工厂模式,也不动态加载是不是就不需要使用了那。

解决方案

解决方案二:
楼主你试试做个支持插件的应用程序
解决方案三:
动态加载dll调用方法
解决方案四:
引用楼主guanzijuan123的回复:

DLL内容都了解的话,直接引用DLL不就好了吗,为什么还要反射。DLL里面的内容什么都不知道的话,就算反射的话,也不知道里面的方法是干什么的啊,和直接引用DLL没区别啊。有的说工厂模式动态加载DLL时需要用到反射如果我不用工厂模式,也不动态加载是不是就不需要使用了那。

如果你不用编程,连编程语言都不用学了。。
解决方案五:
反射就是运行时检查和处理程序元素的功能枚举类型的成员;实例化新对象;执行对象的成员;查找类型的信息;查找程序集的信息;检查应用于类型的定制特性;创建和编译新程序集.
解决方案六:
反射(.NET元数据访问)是一种抽象模式,可以提高开发效率,比如对象序列化。。。
解决方案七:
需要获取类成员信息的时候吧
解决方案八:
楼主会用反射吗,最简单的用法是:可以找出对象所包含成员变量,属性,方法等,然后进行赋值,调用等。但这些成员变量,属性,方法的名称在编程的时候都是不知道的。
解决方案九:
引用楼主guanzijuan123的回复:

DLL内容都了解的话,直接引用DLL不就好了吗,为什么还要反射。DLL里面的内容什么都不知道的话,就算反射的话,也不知道里面的方法是干什么的啊,和直接引用DLL没区别啊。有的说工厂模式动态加载DLL时需要用到反射如果我不用工厂模式,也不动态加载是不是就不需要使用了那。

你说的很对,直接引用可以办到,就不需要反射。问题是,VisualStudio的开发环境为了列举你编写的用户控件的成员,能够直接引用你的dll么?IIS为了将发来的http请求转化为对你写的asp.net程序的调用,可以引用你的程序么?
解决方案十:
引用楼主guanzijuan123的回复:

DLL内容都了解的话,直接引用DLL不就好了吗,为什么还要反射。DLL里面的内容什么都不知道的话,就算反射的话,也不知道里面的方法是干什么的啊,和直接引用DLL没区别啊。有的说工厂模式动态加载DLL时需要用到反射如果我不用工厂模式,也不动态加载是不是就不需要使用了那。

像你说的,的确是不需要。工厂模式也不一定非得反射。不过反射在某些情况下是很管用的,比如你所说的动态加载,不想写死或不能写死,只好反射。
解决方案十一:
通俗的说,反射可以使用未知的dll。
解决方案十二:
dll应该是可以用的
解决方案十三:
需要动态生成一个实例的时候可以考虑使用反射,很多.NET框架中运用了反射,反射有更多的灵活性
解决方案十四:
一个人认为程序开发过程中的“设计”跟自己无关、都是领导的事情,那么他就一辈子没有这方面需求。反之,如果你把口号付诸于实践,那么你必须在一万行代码中总有那么十几行代码明确地使用到反射的。
解决方案十五:
亲.普通的代码.不是dll也可以用反射的.就像是静态调用和动态调用的关系.(类.属性,方法等)名字都可以不是固定的.很方便历遍.
解决方案:
该回复于2013-09-07 00:05:03被版主删除
解决方案:
引用13楼sp1234的回复:

一个人认为程序开发过程中的“设计”跟自己无关、都是领导的事情,那么他就一辈子没有这方面需求。反之,如果你把口号付诸于实践,那么你必须在一万行代码中总有那么十几行代码明确地使用到反射的。

我也不懂,求科普啊,大神!为啥要用C#反射?
解决方案:
动态调用dll,比如这个dll有一个类,我们不知道它里面有什么属性、方法、元素?但通过反射就可以知道它里的属性、方法,就可以实现调用。通过反射获取它的类型是什么?
解决方案:
反射可以用来开发程序插件一类的,别人开发的插件只要继承某个已知的接口,就可以利用反射动态加载进来,然后实例化接口调用,就可以载入别人的插件了
解决方案:
该回复于2015-11-30 23:53:49被版主删除
解决方案:
这么说吧平时你写程序的时候基本上很少用到或者可能都用不到反射除非你接触框架这样的东西你要编写或者修改你才会写反射其他时间只要别人告诉你怎么用就行楼上各位大大都说了反射其实很常用序列化或者做可扩展应用程序等等当然如果你负责框架部分的开发会经常遇到反射的
解决方案:
我的理解就是一种抽象手段,比如委托(函数指针),如果你调用的时候已经知道函数是什么了,那不是也不需要了么?但是当你需要一个抽象的通用的方法的时候,就需要了。
解决方案:
反射就是.net里的内工厂,还有其他很多种用法,通过反射可以把一个textbox里的string编译为一个dll,在动态载入调用执行,可以解决一些特殊的业务需求
解决方案:
该回复于2015-11-30 23:57:24被版主删除
解决方案:
只是因为你还没有用到罢了最简单的举例就是插件了比如别人继承我的接口写了一个插件放在我的程序目录下面然后我程序运行遍历目录下的所有dll然后在里面去调用我的接口这难道不需要用到反射?。。。
解决方案:
我只能告诉你,c#的语言设计内置就预留了反射,即便你程序代码里面不使用任何反射相关的代码,运行时一样会有一部分内存自行预保留处理反射相关的功能,这是不可避免的。为什么要用反射,我举这样一个例子你或许会明白。c#这种高级语法是面向对象编程的,假如你把程序某个功能看成一个房子,反射的一种理解是你可以将这个房子拆解成一个个的单体(很多小零件,或许是小零件的组合等),你可以很方便的操控这些单体零件,另外还可以再组装这些零件,当然,这些是在运行时处理的。
解决方案:
反射不仅仅是撸主描述的这一个用处也可以结合泛型,进行实体间动态赋值,你不就省去了很多行低能的代码了么
解决方案:
[ProAtrribute(DisplayName="点名",StoreToDB=true,DisplayOnUI=true,Unique=true,DbType=DbType.String)]publicstringPOINT_NAME{get;set;}//我不知道使用这种玩儿能不能算反射,反正动态生成SQL语句非常有用
解决方案:
需要的时候用如果非要举个例子那么IoC、AOP、Remoting都需要
解决方案:
比如你的程序可以让用户自己开发插件,就可以预留接口,反射加载。还有很多其他功能
解决方案:
IDE的智能感知功能!
解决方案:
效率吧,对元数据访问,可能多做很多事情。
解决方案:
你这人抽象思维不够。给个题目你做吧。设计一段程序,能自动给页面上的表单元素赋值。比如:publicclassTest{publicstringName{get;set;}}如果:已知一个实际对象:Testt=newTest(){Name="xiaoming"};页面上的表单元素为:<asp:TextBoxID="txt_Name"runat="server"></asp:TextBox>唯一的规则是类的属性名称与表单元素的名称(第一个_之后的部分)相同。如果你觉得可以不用反射做,那么:在添加任何多个你开始不知道名称的表单元素的情况下,你还能不能做出来?
解决方案:
说得没错,你不用工厂模式,不动态加载,就不需要用反射,而且反射是会影响执行效率的,虽然.Net框架已经大幅提升了反射时的效率了。用不用反射和实际需求是密切相关的,楼上那些和你鬼扯反射有什么作用,有多么好的,还给你出个毫无实际意义的题目的,都是没搞清楚你想问得是什么的。
解决方案:
引用33楼masanaka的回复:

说得没错,你不用工厂模式,不动态加载,就不需要用反射,而且反射是会影响执行效率的,虽然.Net框架已经大幅提升了反射时的效率了。用不用反射和实际需求是密切相关的,楼上那些和你鬼扯反射有什么作用,有多么好的,还给你出个毫无实际意义的题目的,都是没搞清楚你想问得是什么的。

你明白这个题的用意么?执行效率当然重要,但有时为了开发效率也可以牺牲一下,并是每个地方都需要那么快的执行效率,慢0.01秒并没有什么了不起。不过也别争了吧,楼猪13年的贴,没意思。
解决方案:
我现在已经将软件的功能都封装成了一个一个的动态库,我再想将软件运行的流程用EXCEL写出来,把这些库名称以及参数都写在EXCEL中,但是如何在软件里面进行调用,是否就要用到反射?
解决方案:
就举一个例子吧,如果程序中某个地方需要实例化整个程序中所以继承某接口的类,这个时候难道你要去程序中找到所有符合条件的类再实例化?而反射就可以很好的解决这个问题
解决方案:
方便,你直接引用每个都要引用,新写的还要去重新编译发布等等so你懂得
解决方案:
dll各种版本的变化,你不可能每次都编译成同一个版本,这样管理会混乱。这样子也是一种很好的我解藕方式,你如果dll很庞大,引用进工程是不会很方便的。
解决方案:

解决方案:
看看这个吧
解决方案:
引用16楼dth886的回复:

Quote: 引用13楼sp1234的回复:
一个人认为程序开发过程中的“设计”跟自己无关、都是领导的事情,那么他就一辈子没有这方面需求。反之,如果你把口号付诸于实践,那么你必须在一万行代码中总有那么十几行代码明确地使用到反射的。

我也不懂,求科普啊,大神!为啥要用C#反射?

你不是在问题中表明了嘛!人家告诉你“有的说工厂模式动态加载DLL时需要用到反射”,你直接来一句“如果我不用工厂模式......”,这不就是典型的故意抬杠嘛!就像有的家长跟子女说“好好学习,将来有个好前途”,孩子说“如果我不想有个好前途,只想玩儿,那么......”,这不就是抬杠嘛。这时候你还让人再给你“科普”?传统一点的家庭,直接就不给你饭吃。
解决方案:
这里,我认为你的问题不是关于“反射”的技术问题,而是心理上和逻辑上故意的问题。
解决方案:
心理问题造成了不成熟的争议,阻止了真正的技术讨论。工厂模式它本身就是“反射、注入”概念的设计超级,它就是体现了通过配置或者传输而反射出来一些未知类型的对象实例(这些实例实现了统一的业务父类或者父接口)。问题是你的方式——姿势,不像是虚心学习反射应用的哦?!
解决方案:
一般的构架,都有用到反射,便于扩展,dll和类名可以自己传入
解决方案:
楼主问的问题很入门,大神们都理解不了,回答也是太深了.楼主的问题就好比,我要算1+1=2不需要类,甚至不需要写一个函数,直接输出1+1不就完了吗?任何一门技术存在即合理,楼主要是想知道什么时候用什么时候不用只有在你用过若干次之后才能深刻了解这门技术到底有什么用,而且到时候你自然理解了,就好像刚开始学编程的人,问面向对象有什么用,我不用面向对象也可能写出来啊.
解决方案:
引用13楼sp1234的回复:

一个人认为程序开发过程中的“设计”跟自己无关、都是领导的事情,那么他就一辈子没有这方面需求。反之,如果你把口号付诸于实践,那么你必须在一万行代码中总有那么十几行代码明确地使用到反射的。

装B
解决方案:
大家对于24000小时之前的帖子这么热情啊
解决方案:
比如你做一个平台,里面可以挂很多插件!这些插件都是程序执行时动态加载的,这时,就用到了反射。
解决方案:
网友给的一个例子,个人觉得还不错比如有一个猫类:publicclassCat{publicintAge{get;set;}publicstringName{get;set;}//假设它的属性还有很多很多}现在问题是:我NEW一个猫叫"小猫1",我想复制这一个对象,“小猫2”,那该怎么处理呢?像下面这样吗:Catc1=newCat(){Age=20,Name="小猫1"};Catc2=c1;那这样肯定是错的。因为c1和c2都引用的是同一个对象“小猫1”,那我现在想复制一个跟小猫1一模一样的对象怎么处理呢?这里就用到了反射:方法:protectedvoidPage_Load(objectsender,EventArgse){Catc1=newCat(){Age=20,Name="小猫"};Typetype=typeof(Cat);Catc2=newCat();foreach(System.Reflection.PropertyInfoinfointype.GetProperties()){info.SetValue(c2,info.GetValue(c1,null),null);}Label1.Text=c2.Name;Label2.Text=c2.Age.ToString();}
解决方案:
反射的性能很低,其实很多时候就是装B的时候用反射

时间: 2024-10-13 01:06:39

C# 为什么要用反射,什么情况必须使用反射。的相关文章

理解C#中反射的有关概念与反射的应用

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌.如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道. 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构. 应用程序结构分为应用程序域-程序集-模块-类型-成员几个层次,公共语言运行库加载器管

反射 # sp et-反射:反射是个什么东西,怎么用,什么时候用,具体用法。最好用通俗易懂的话讲解哈

问题描述 反射:反射是个什么东西,怎么用,什么时候用,具体用法.最好用通俗易懂的话讲解哈 反射:本人比木乃,是哪位大师详细讲解反射是个什么东西,能看得见,摸得着吗.怎么用,什么时候用,具体用法.最好用通俗易懂的话讲解哈 解决方案 反射简单来说就是RTTI(运行时刻类型识别)和DC(动态创建). RTTI的典型应用场景:比如说Visual Studio能列举出你引用的某个动态库中都有什么函数,参数是什么,这个动态库显然事先VS不知道它的存在.是运行的时候获取它的类型信息.这个就是RTTI DC的场

c#反射机制-如何利用C#反射机制来取得值

问题描述 如何利用C#反射机制来取得值 C:UsersZzDesktopQQ图片20131009141532.jpg 解决方案 取什么值呢.说的不太清楚不好回答啊

PHP反射使用实例和PHP反射API的中文说明_php实例

最近在开发过程中需要获取某个类方法的参数数量.名称及参数顺序,好根据参数的名称来从$_GET里取值. 如方法原型为test($uid,$score), 那么我就知道需要需要从$_GET取 复制代码 代码如下: $uid = $_GET['uid']; $score = $_GET['score']; 然后调用方法$obj->test($uid,$score) 当然前提是约定好了参数名称和get方法传值变量名一致. 采用PHP的反射API,获得函数参数名称和参数默认值的方法如下: 复制代码 代码如

对.NET Framework 反射的反思

清晰的组件化目标是否因在库间共享过多类型信息而落空?或许您需要高效的强类型化数据存储,但如果每次对象模型发展后都需要更新您的数据库架构,那会耗费很大成本,所以您更愿意在运行时推断出其类型架构吗?您需要交付能接受任意用户对象的组件,并以某种智能化的方式处理它们吗?您希望库的调方者能以编程方式向您说明它们的类型吗? 如果您发现自己在苦苦维持强类型化数据结构的同时,又冀望于最大化运行时灵活性,那么您大概会愿意考虑反射,以及它如何改善您的软件.在本专栏中,我将探讨 Microsoft .NET Fram

简述.Net 中的反射机制

概述反射 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象. 反射机制允许程序在执行过程中动态地添加各种功能. 运行时类型标识 运行时类型标识(RTTI),可以在程序执行期间判定对象类型.例如使用它能够确切地知道基类引用指向了什么类型对象. 运行时类型标识,能预先测试某个强制类型转换操作,能否成功,从而避免无效的强制类型转换异常. 在c#中有三个支持RTTI的关键字:is . as  .typeof. 下面依次介绍他们 is运算符: 通过is运算符,能够判断对

CLR完全介绍: 反射之反思

您清晰的组件化目标是否因在库间共享过多类型信息而落空?或许您需要高效的强类型化数据存储,但如果每次对象模型发展后都需要更新您的数据库架构,那会耗费很大成本,所以您更愿意在运行时推断出其类型架构吗?您需要交付能接受任意用户对象的组件,并以某种智能化的方式处理它们吗?您希望库的调方者能以编程方式向您说明它们的类型吗? 如果您发现自己在苦苦维持强类型化数据结构的同时,又冀望于最大化运行时灵活性,那么您大概会愿意考虑反射,以及它如何改善您的软件.在本专栏中,我将探讨 Microsoft .NET Fra

Java编程的动态性,第8部分: 用代码生成取代反射

从本系列前面的文章中,您了解到反射的性能比直接访问要慢许多倍,并了解了用 Javassist 和 Apache Byte Code Engineering Library (BCEL)进行classworking.Java 顾问 Dennis Sosnoski 通过演示如何使用运行时 classworking,来用全速前进的生成代码 取代反射代码,从而结束他的 Java 编程的动态性系列. 既然您已经看到了如何使用 Javassist 和 BCEL 框架来进行 classworking ,我将展

非ROOT实现静默安装的一些思考与体会,AIDL获取IPackageManager,反射ServiceManager,系统签名

非ROOT实现静默安装的一些思考与体会,AIDL获取IPackageManager,反射ServiceManager,系统签名 最近自家的系统要做一个升级服务,里面有三个功能,第一个是系统升级,也就是下载OTA包推送到recovery里升级的,而第二个是MCU升级,这就涉及到我们自家系统的一些情况了,而第三个就是应用升级了,领导要求不要骚扰用户,于是我就想到了静默安装了,因为我们的系统是在wifi环境下工作的,所以不担心流量哈,而且我们系统是没有ROOT的,所以我们肯定野不能使用RunTime方