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

Lon*_*der 1 .net c# reflection class c#-4.0

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

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

所以我想知道的是:

Reflection如何工作?它如何获取信息?(简短的解释会做)

为什么不建议在应用程序中使用反射?如果你需要获得所需信息是一个字段或属性的值或名称,你可以做到这一点使用的System.Reflection?

一些背景.

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

我可以想到其他方法让它作为一个回归List<strings>.

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

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

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

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

更新

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

谢谢 .

The*_*kis 7

CLR程序集(可执行文件或动态链接库)通常包含有关其结构的元数据,这意味着有关类型,结构,方法,字段,名称和一堆其他信息的信息,这些信息在"传统"语言中是通常只会丢失并替换为偏移量和大小信息.

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

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

  • 事实上,即使我不知道你的大多数技术基本信息中描述了什么,我现在可以很容易地提取一些关键术语来搜索.谢谢...看起来你真的深入研究了它. (2认同)