使用反射成为可能的C#语言的属性是什么?

时间:2014-01-29 09:21:45

标签: .net oop reflection interpreted-language

使反射成为可能的C#语言的属性是什么?它是所有面向对象语言都可以做的事情,还是所有解释语言都能做到的事情?或其他什么......

4 个答案:

答案 0 :(得分:9)

编译器知道有关您编写的程序的批次。它知道你编写的每个类,方法的名称,它们所采用的参数。传统上,编译器在为程序生成可执行代码后,会将有关程序的额外信息抛弃。

不是.NET编译器,它保留该信息。它存储在程序集的元数据中。除生成的代码之外的.NET .exe或.dll文件中的额外数据结构。通过运行时支持库中的管道来在运行时读取该数据结构,System.Type类是有用的。

这不是它结束的地方,您还可以向该元数据添加任意额外数据。这是[属性]的全部内容。

这可以实现各种非常有趣和有用的功能。就像动态改变代码在运行时生成的方式一样。或者在不知道其类名的情况下动态创建对象。或者将类型的视图从其实现转换为更容易处理的有用的其他表示。这反过来又启用了序列化和设计时支持等功能。反射是这背后的引擎,元数据就是源头。

答案 1 :(得分:1)

C#中所有类型/方法的元数据都可以通过反射来访问。通常,您必须使用BindingFlags指定所需的对象类型。

示例:

MethodInfo[] myArrayMethodInfo1 = myType.GetMethods(BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);

答案 2 :(得分:0)

反思是一种语言成为他自己的元语言的能力。

例如:

int i = 42;
System.Type type = i.GetType();
System.Console.WriteLine(type);

您可以将它应用于类,对象和方法。

C#是一种编译语言,C#编译器生成的字节码由虚拟机解释。反思与特定范式无关,这取决于语言的设计方式。

答案 3 :(得分:0)

总结Hans Passant所说的话,

每个编译的C#程序都被编码到关系数据库中 - 这称为元数据。 通过反思,我们可以根据此特殊数据库中的数据进行操作。

what is reflection in C#, what are the benefit. How to use it to get benifit

也读这个。