使反射成为可能的C#语言的属性是什么?它是所有面向对象语言都可以做的事情,还是所有解释语言都能做到的事情?或其他什么......
答案 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
也读这个。