在3分钟内,什么是反思?

许多.Net面试问题列表( 包括好的问题列表)包含了一个问题:“什么是反思?”。 最近我被要求在5个问题的技术testing中回答这个问题,技术testing在15分钟内完成,在一张食堂递给我的一张白纸上。 我的回答是沿着“reflection允许您在运行时发现任何对象的方法,属性和字段”的行。 回想起来,我的答案解释了如何使用reflection,但是它不能解释reflection是什么。 在我看来,我的回答足以说明我明白了什么是反思但没有解释什么是反思。

因此,请在.Net的背景下,用你自己的简洁的话来说明反思什么。 不要花费三分钟以上的时间来回答。 不要参考.Net文档 ,我们都已经看到了。

反思是以dynamic的方式查询和与types系统交互的能力。

一种内省的forms,即能够编写查询代码的代码

reflection是CLR对代码级对象的认识,例如通过API公开的System.Reflection,它允许开发人员利用运行时对代码中这些信息的认识。

违反规则 :为了准确,我从原始的forms编辑了这个答案。

反思就是程序将自己作为数据处理的能力。

反思就像海军凝视代码。

在编译.Net语言的过程中,编译器将有关程序的信息放入程序文件中。 这些信息可以被程序本身或其他程序用来找出程序包含哪些类,它们的方法,属性,字段和事件是什么。 即使其他程序在运行之前对它们一无所知,也可以通过reflection来使用类和它们的方法,属性等。 这使得不同的程序可以松散耦合,并使各种令人兴奋的编程成为可能。 还可以使用reflection来构build运行程序或程序文件中的其他类。

我喜欢你的答案,但我也提到reflection也是一种获取/设置私有/受保护的领域/属性,否则不会在运行时可用的方式。

反思是代码的简历。

reflection是元数据和微软中间语言(MSIL)一起包装在一个可移植的Excutable(PE)文件中,这可以在运行时通过机制来访问。

reflection只不过是能够在运行时dynamic地访问其他dll的方法,这些dll不包含在你的项目中(可能是系统或你自己创build的)。 避免循环依赖问题也是有帮助的。

reflection就是像GOD那样行事的能力 – 你可以“看见”一个程序集的内部,并且执行各种行为(System.Reflection),特别是为运行时devise的,比如查询types和他们的成员,search接口或属性,实例化编译时不知道的types,甚至创build新的types(System.Reflection.Emit)。

通过在C#中使用Reflection,人们可以在运行时find对象,方法的细节,创build对象和调用方法。

 using System; using System.Reflection; public class MyClass { public virtual int AddNumb(int numb1,int numb2) { int result = numb1 + numb2; return result; } } class MyMainClass { public static int Main() { // Create MyClass object MyClass myClassObj = new MyClass(); // Get the Type information. Type myTypeObj = myClassObj.GetType(); // Get Method Information. MethodInfo myMethodInfo = myTypeObj.GetMethod("AddNumb"); object[] mParam = new object[] {5, 10}; // Get and display the Invoke method. Console.Write("\nFirst method - " + myTypeObj.FullName + " returns " + myMethodInfo.Invoke(myClassObj, mParam) + "\n"); return 0; } } 

下面的代码将获得types信息:

 Type myTypeObj = Type.GetType("MyClass"); 

下面的代码片段将获得方法的信息

 Methodinfo myMethodInfo = myTypeObj.GetMethod("AddNumb"); 

下面的代码片段将调用AddNumb方法:

 myMethodInfo.Invoke(myClassObj, mParam);