2012-12-12 40 views
0

我建议不要使用反射。我真的很想知道,是不是因为Reflection是昂贵的?如果不是,避免使用它的原因是什么?System.Reflection如何工作访问类成员数据/信息?

我目前和未来的项目可能需要访问任何给定的类成员信息。由于我有时需要列出字段&属性 - 值或声明名称。

所以我想知道什么是:

反射波如何工作的?它如何获得信息? (一个简短的解释就可以)

为什么不推荐在应用程序中使用反射?如果您确实需要获得所需的信息是字段或属性值OR名称,您是否可以通过使用System.Reflection来执行而不是

一些背景。

我当前项目中的用法(例如)是列出一个特定的sql server表 - 列名或SQL表名。

我可以想到其他方式将它作为List<strings>返回。

如果我真的知道为什么或如何“坏”是,使用reflection

..我会再做出决定,如果我真的想避免它,因为我可能会找到一个替代方法(在这个特定的情况下)。

无论是通过访问数据库(不是首选),我需要(说)表名列表或我可以做一次(访问数据),然后将其存储在文本文件或XML,如果我真的必须避免反射。

我知道一些更优雅的。虽然这不是问题。 (再次,这只是因为可能有很多其他使用情况的例子,你可能知道)。

更新

,这一问题被关闭,请帮助重新打开它,并低于

票“重启”谢谢 。

+1

如何使用反射来获取SQL列的列表?为什么不从'INFORMATION_SCHEMA.COLUMNS'选择*? – Blorgbeard

+2

@Blorgbeard。请 看到我的帖子的末尾读它,直到最后,你可以更好地理解为我所做的quetion本身BOLD – LoneXcoder

+2

@Blorgbeard你怎么会认为我已经完成它,让所有的表列的身份是作为第一位的一类?还是你提供每次我需要它作为性能微调的数据库? – LoneXcoder

回答

6

甲CLR组件(可执行文件或动态链接库)通常含有约它的结构,这意味着有关的类型,结构,方法,字段,它们的名称和一堆其他信息的信息的元数据,在“传统“语言通常会丢失,只能由补偿和大小信息取代。

反射是一种功能强大的工具,只能使用反射来实现一些(通常是高级)的东西。但是,它也引发了对安全和封装的担忧,因为你开始依赖于程序的某些部分(或其他程序)的实现,而通常应该避免这些并且只相信这些部分给出的接口。另一个值得关注的问题是性能,因为要访问所有这些(最终是文本的)信息,程序会放慢速度,这与使用非反射方法(通常仍然使用偏移量和大小信息)相反。例如,您可以使用反射重新实现多态,并绕过虚拟方法表。但后者比前者快很多倍。

使用反射,如果你要,但如果你没有不使用它。它是非常强大的工具之一,人们建议不要使用它们,但是如果你真的知道自己在做什么,你可以使用它们。也就是说,请记住,以错误的方式使用反射技术不仅会引发上述问题,而且还会使代码难以维护。

+2

加上一个如此信息量大,事实上,即使我不知道什么是最你的技术基础信息的描述,我可以很容易现在,能够提取的一些关键条款上搜索。谢谢你......看起来你真的深入研究过它。 – LoneXcoder

+0

Chatzigiannaki,听起来很愚蠢,但它让我用左脚开始新的一天,(对不起我的英语......)虽然你能帮我一下吗? **最后查看更新** – LoneXcoder

2

如果它像“从不使用反射”一样简单,我们根本就不会有反射。

反射慢,因此,您必须明智的使用它。通常情况下,有更好的解决方案(包括设计和性能)使用接口,委托等来实现您的目标(想到依赖注入和动态类型)。

试图找出如何解决您的问题使用面向对象设计没有反射。如果您确实需要使用反射,请考虑其性能如何影响您的应用程序,并进行相应的设计。

0

反射通过解析类类型信息起作用。因为它的计算成本很高,所以要谨慎使用它。