System.Reflection如何工作访问类成员数据/信息?

时间:2012-12-12 19:14:51

标签: c# .net class c#-4.0 reflection

我被建议不要使用Reflection。我真的很想知道,是因为反射昂贵?如果不是,避免使用它的原因是什么?

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

所以我想知道的是:

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

为什么不建议在应用程序中使用反射?如果您确实需要获取所需的信息作为字段或属性值OR名称,您是否可以使用System.Reflection 而不是

一些背景。

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

我可以想出其他方法让它作为List<strings>返回。

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

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

通过访问数据库(不是更好),我需要(比方说)表名列表,或者我可以做一次(访问数据),然后将其存储在文本文件或xml中,如果我真的必须避免反射

我也知道一些更优雅的一个。但这不是问题。 (这只是一个例子,因为可能有许多其他用例,你可能知道。)

更新

此问题已结束,请帮助重新打开,并在下方投票'重新开启'

谢谢。

3 个答案:

答案 0 :(得分:7)

CLR程序集(可执行文件或动态链接库)通常包含有关其结构的元数据,这意味着有关类型,结构,方法,字段,名称和一堆其他信息的信息,在“传统”中语言通常会丢失,仅由偏移和大小信息取代。

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

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

答案 1 :(得分:2)

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

反射 很慢,因此,你必须明智地使用它。通常有更好的解决方案(在设计和性能方面)使用接口,代理等来实现您的目标(依赖注入和动态类型)。

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

答案 2 :(得分:0)

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