我对 ASP.NET 很陌生。我来自 VB6/ASP(经典)/SQL Server 2000 背景。我正在阅读很多有关 Visual Studio 2008 的内容(已经安装并正在四处寻找)。我已经阅读了有关“反射”的内容,并希望有人尽可能地向我上面编写的技术的老开发人员解释,反射到底是什么以及我为什么要使用它......我很难得到我的头围绕着那个。谢谢!
6 回答
反射是您如何探索不同类型的内部,而无需通常访问(即私有、受保护等成员)。
它还用于动态加载 DLL 并访问其中定义的类型和方法,而无需将它们静态编译到您的项目中。
简而言之:Reflection 是你的工具包,用于窥探一段代码的底层。
至于为什么要使用它,它通常只用于复杂的情况,或者代码分析。另一个常见用途是将预编译的插件加载到您的项目中。
反射允许您以编程方式加载程序集,获取程序集中所有类型的列表,获取这些类型中所有属性和方法的列表等。
举个例子:
myobject.GetType().GetProperty("MyProperty").SetValue(myobject, "wicked!", null)
它允许将对象的内部反映到外部世界(使用所述对象的代码)。
在像 C#(和 Java)这样的静态类型语言中的一个实际用途是允许在运行时通过字符串调用方法/成员(例如方法的名称 - 也许您不知道将在编译时使用的方法的名称时间)。
在动态语言的上下文中,我没有听过这个术语(因为通常你不担心上面的问题),然后可能遍历方法/成员列表等......
反射是.Net 在运行时操作或提取程序集、类或方法信息的手段。例如,您可以在运行时创建一个类,包括它的方法。正如 monoxide 所述,反射用于动态加载程序集作为插件,或者在预先情况下,它用于创建面向 .Net 的 .Net 编译器,如 IronPython。
更新:您可以参考元编程主题及其相关主题以获取更多详细信息。
当您在 .NET(ASP.NET、Windows 窗体、命令行、类库等)中构建任何程序集时,还会在程序集中创建许多元数据“定义表”,存储有关方法、字段和类型的信息您在代码中编写的类型、字段和方法。
.NET 中 System.Reflection 命名空间中的类允许您对这些表进行枚举和交互,为您提供“对象模型”来查询和访问这些表中的项目。
反射的一种常见用途是为您的应用程序提供可扩展性(插件)。例如,反射允许您从文件路径动态加载程序集,查询其类型以获得特定的有用类型(例如您的应用程序可以调用的接口),然后实际调用此外部程序集上的方法。
自定义属性也与反射齐头并进。例如,NUnit 单元测试框架允许您通过将 [Test] {TestFixture] 属性添加到您自己的代码来指示测试类和测试方法。
但是,NUnit 测试运行程序必须使用反射来加载您的程序集,搜索所有出现的具有 test 属性的方法,然后实际调用您的测试。
这大大简化了它,但是它为您提供了一个很好的实际示例,说明反射是必不可少的。
反射当然很强大,但是请注意,它允许您完全忽略面向对象编程中访问修饰符(封装)的基本概念。
例如,您可以轻松地使用它来检索类中的私有方法列表并实际调用它们。出于这个原因,您需要仔细考虑如何以及在何处使用它,以避免绕过封装和非常紧密耦合(不良)的代码。
反射是检查应用程序元数据的过程。换句话说,在阅读属性时,您已经看过反射提供的一些功能。反射使应用程序能够收集有关自身的信息并根据这些信息采取行动。反射比正常执行静态代码要慢。但是,它可以为您提供静态代码无法提供的灵活性