什么是反思?

时间:2008-10-05 02:26:06

标签: reflection metaprogramming

我对ASP.NET非常陌生。我来自VB6 / ASP(经典)/ SQL Server 2000背景。我正在阅读很多关于Visual Studio 2008的内容(已安装它并且正在探索)。我读过有关“反思”的内容,并希望有人向我上面介绍的技术的老开发者尽可能地解释,究竟反思是什么以及为什么我会使用它......我无法获得我绕过那个。谢谢!

6 个答案:

答案 0 :(得分:8)

反思是如何探索不同类型的内部结构,而无需通常具有访问权限(即私有,受保护等成员)。

它还用于动态加载DLL并访问其中定义的类型和方法,而无需将它们静态编译到项目中。

简而言之:反射是您在一段代码的引擎下窥视的工具包。

至于为什么要使用它,它通常只用于复杂情况或代码分析。另一个常见用途是将预编译的插件加载到项目中。

答案 1 :(得分:3)

Reflection允许您以编程方式加载程序集,获取程序集中所有类型的列表,获取这些类型中所有属性和方法的列表等。

举个例子:

myobject.GetType().GetProperty("MyProperty").SetValue(myobject, "wicked!", null)

答案 2 :(得分:2)

它允许对象的内部反射到外部世界(使用所述对象的代码)。

在C#(和Java)等静态类型语言中的实际用途是允许在运行时通过字符串调用方法/成员(例如方法的名称 - 也许你不知道你将使用的方法的名称在编译时使用)。

在动态语言的上下文中,我没有那么多地听过这个术语(通常你不担心上面的内容),其他可能是迭代方法/成员列表等......

答案 3 :(得分:1)

反射是.Net的意思是在运行时操纵或提取装配,类或方法的信息。例如,您可以在运行时创建一个类,包括它的方法。正如一氧化碳所述,反射用于动态加载程序集作为插件,或者在事先的情况下,它用于创建.Net编译器,目标.Net,如IronPython。

已更新:有关详细信息,请参阅metaprogramming主题及其相关主题。

答案 4 :(得分:0)

在.NET(ASP.NET,Windows窗体,命令行,类库等)中构建任何程序集时,还会在程序集中创建许多元数据“定义表”存储与您在代码中编写的类型,字段和方法相对应的方法,字段和类型的信息。

.NET中System.Reflection命名空间中的类允许您枚举和交互这些表,为您提供“对象模型”,以便您查询和访问这些表中的项目。

Reflection的一个常见用途是为您的应用程序提供可扩展性(插件)。例如,Reflection允许您从文件路径动态加载程序集,查询其类型以获取特定的有用类型(例如应用程序可以调用的接口),然后实际调用此外部程序集上的方法。

自定义属性也与反射同时进行。例如,NUnit单元测试框架允许您通过将[Test] {TestFixture]属性添加到您自己的代码来指示测试类和测试方法。

然而,NUnit测试运行器必须使用Reflection来加载程序集,搜索具有test属性的所有方法,然后实际调用测试。

这简化了很多,但是它为您提供了反射必不可少的实用示例。

反射肯定是强大的,但它可以让你完全忽略面向对象编程中访问修饰符(封装)的基本概念。

例如,您可以轻松地使用它来检索类中的私有方法列表并实际调用它们。因此,您需要仔细考虑使用它的方式和位置,以避免绕过封装和非常紧密耦合(错误)的代码。

答案 5 :(得分:0)

Reflection是检查应用程序元数据的过程。换句话说,在读取属性时,您已经了解了一些反映 提供。反射使应用程序可以收集有关其自身的信息并对此进行操作, 编队。反射比正常执行静态代码慢。但是它可以给你 静态代码无法提供的灵活性