什么是反思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是反思?相关的知识,希望对你有一定的参考价值。

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

答案

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

举个例子:

myobject.GetType().GetProperty("MyProperty").SetValue(myobject, "wicked!", null)
另一答案

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

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

简而言之:Reflection是您在一段代码的引擎下偷看的工具包。

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

另一答案

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

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

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

另一答案

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

更新:您可以参考有关metaprogramming及其相关主题的主题以获取更多详细信息。

另一答案

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

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

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

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

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

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

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

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

另一答案

反射是检查应用程序元数据的过程。换句话说,在阅读属性时,您已经了解了反射提供的一些功能。反射使应用程序能够收集有关自身的信息并对此信息采取行动。反射比正常执行静态代码慢。但是,它可以为您提供静态代码无法提供的灵活性

以上是关于什么是反思?的主要内容,如果未能解决你的问题,请参考以下文章

什么是反思?

关于耦合度的一点反思

为什么依靠反思是不可取的?

Unity Shader 阶段性反思与总结

C# 最有用的(自定义)代码片段是啥? [关闭]

2019.10.26 csp-s模拟测试88 反思总结