使反射成为可能的 C# 语言的特性是什么?是所有面向对象语言都可以做的事情,还是所有解释语言都可以做的事情?或者是其他东西...
4 回答
编译器非常了解您编写的程序。它知道您编写的每个类、方法的名称、它们采用的参数。传统上,编译器在为您的程序生成可执行代码后会丢弃有关您程序的额外信息。
不是 .NET 编译器,它保留了该信息。它存储在程序集的元数据中。.NET .exe 或 .dll 文件中的额外数据结构,超出了生成的代码。通过运行时支持库中的管道在运行时读取该数据结构,System.Type 类是有帮助的。
这不是它结束的地方,您还可以向该元数据添加任意额外数据。这就是 [attribute] 的全部意义所在。
这使得各种非常有趣和有用的功能成为可能。就像动态改变代码在运行时生成的方式一样。或者在不知道类名的情况下动态创建对象。或者将类型的视图从其实现转换为更易于处理的有用的其他表示。这反过来又启用了序列化和设计时支持等功能。反射是这背后的引擎,元数据是源头。
C# 中所有类型/方法的元数据都可以通过反射访问。通常你必须使用 BindingFlags 来指定你需要的对象类型。
例子:
MethodInfo[] myArrayMethodInfo1 = myType.GetMethods(BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
反射是一种语言成为他自己的元语言的能力。
例如:
int i = 42;
System.Type type = i.GetType();
System.Console.WriteLine(type);
您可以将其应用于类、对象和方法。
C# 是一种编译语言,C# 编译器生成的字节码由虚拟机解释。反射与特定的范例无关,它取决于语言的设计方式。
总结一下 Hans Passant 所说的话,
每个编译的 C# 程序都被编码到一个关系数据库中——这称为元数据。通过反思,我们对这个特殊数据库中的数据采取行动。
也读这个。