当前位置: 首页 > 编程语言 > C#

什么是编程语言的反射属性?分享

时间:2023-04-10 14:07:03 C#

编程语言的反射属性是什么?它说大多数高级动态类型语言都是自反的。维基百科上的Reflection(ComputerProgramming)对此进行了解释,但并未真正给出其含义。任何人都可以通过相关示例以更简单的方式解释它吗?给你一个如何以实际方式使用反射的例子:假设你正在开发一个你希望使用插件扩展的应用程序。这些插件是简单的程序集,仅包含一个名为Person的类:私有字符串_postname;publicstringGetName(){...concatvariabesandreturn...}}}好吧,插件应该在运行时扩展您的应用程序。这意味着当您的应用程序已经运行时,应该从另一个程序集中加载内容和逻辑。这意味着这些资源不会编译到您的程序集中,即MyApplication.exe。假设它们在库中:MyObjects.Person.dll。您现在面临着需要提取此信息的事实,例如从MyObjects.Person中提取信息以访问GetName()函数。//创建一个程序集对象来加载我们的类AssemblytestAssembly=Assembly.LoadFile(Application.StartUpPath+@"MyObjects.Person.dll");输入objType=testAssembly.GetType("MyObjects.Person");//创建MyObjects.Person的实例varinstance=Activator.CreateInstance(objType);//调用方法stringfullname=(string)calcType.InvokeMember("GetName",BindingFlags.InvokeMethod|BindingFlags.Instance|BindingFlags.Public,null,instance,null);如您所见,您可以使用System.Reflection在运行时动态加载资源。了解如何使用它可能会有所帮助。查看此页面以查看有关如何更详细地访问程序集的示例。这和我写的基本一样。为了更好地理解反射,考虑一个评估程序的解释器。解释器是一个评估其他程序的程序。该程序可以(1)检查和(2)修改其(a)自己的状态/行为,或运行它的交互器的状态/行为(b)。然后有四种组合。以下是每个操作的示例:类型a称为结构反射。b型称为行为反射。类型a的反射在该语言中相当容易实现。b型反射更复杂,尤其是2b——这是一个开放的研究课题。大多数人通过反思理解的是1a和2a。为了理解反射,理解具体化的概念很重要。在解释程序中评估语句时,解释器需要表示它。该解释器可能反对对正在解释的程序的字段、方法等建模。毕竟,解释器也是一个程序。通过反射,解释程序可以获得对解释器中表示其自身结构的对象的引用。这是具体的。(下一步是理解因果关系。)有各种反射特征,有时很难理解什么是反射及其含义。从编程和解释的角度思考。我希望它能帮助你理解维基百科页面(它可以改进)。反射是在运行时查询你编写的程序的元数据的能力,例如:在程序集中找到了哪些类,这些类包含哪些方法、字段和属性等等。.net甚至包括“属性”,这些属性是可以用类、方法、字段等装饰的类,它们的目的是添加可以在运行时查询的自定义元数据。许多计时细节仅取决于元数据。验证时我们不关心string或int,但我们关心它不应该为null。所以在这种情况下你需要检查一个或多个属性而不关心具体的类。图片中出现倒影。另外,如果你想快速生成方法(在C#4.0的动态对象中可用),你也可以使用反射。基本上它有助于进行行为驱动或面向方面的编程。另一个流行的用途是测试框架。他们使用反射来找到一种在代理环境中测试和运行它的方法。编程语言能够根据运行时信息调整它们的行为。在.Net/C#世界中,它被广泛使用。例如,在将数据序列化为xml时,可以添加一个属性来指定生成的xml中字段的名称。对于programmers.stackexchange.com,这可能是一个更好的问题。但这基本上只是意味着您可以查看代码中的代码。回到我的VB6时代,有一些UI对象具有文本属性,而其他对象具有描述(或“文本”以外的其他内容,我忘记了)。这很痛苦,因为我无法封装以相同方式处理两种对象的代码。通过反射,我至少可以查看对象是否具有Text或Description属性。或者有时对象可能都具有Text属性,但它们派生自不同的基类并且没有应用任何接口。同样,如果没有反射的帮助,很难用静态类型的语言封装这样的代码,但即使是静态类型的语言也可以使用反射来处理它。以上是C#学习教程:什么是编程语言的Reflection属性?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: