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

时间:2009-12-07 13:14:50

标签: .net reflection

许多.Net访谈问题清单(including the good ones)包含一个问题:“什么是反思?”。我最近被要求在5个问题的背景下回答这个问题,技术测试是在15分钟内在一张自助餐厅交给我的空白纸上完成的。我的回答是“反射允许您在运行时发现任何对象的方法,属性和字段”。回想起来,我的回答解释了如何使用反射,但它没有解释反射是什么。在我看来,我的回答足以表达我理解的反思,但没有解释的反映。

所以,请在.Net的上下文中,用您自己的简洁词语,定义Reflection 的内容。回答不要花费超过三分钟。不要参考the .Net documentation,我们都已经看过了。

12 个答案:

答案 0 :(得分:43)

反射是以动态方式查询类型系统并与之交互的能力。

答案 1 :(得分:12)

一种内省形式,即编写查询代码的代码的能力

答案 2 :(得分:9)

反射是CLR对代码级对象的认识,例如通过API公开的类名,方法等,即System.Reflection,它允许开发人员在其代码中利用运行时对这些信息的认知。 / p>

规则违规:为了准确起见,我从原始表单中编辑了此答案。

答案 3 :(得分:8)

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

答案 4 :(得分:6)

反思就像海军凝视代码一样。

答案 5 :(得分:5)

在编译.Net语言期间,编译器将有关程序的信息放入程序文件中。程序本身或其他程序可以使用此信息来查找程序包含哪些类,它们的方法,属性,字段和事件。即使其他程序在运行之前对它们一无所知,也可以通过反射使用类及其方法,属性等。这允许不同的程序松散耦合并使各种令人兴奋的编程成为可能。 Reflection也可用于在运行程序或程序文件中构建其他类。

答案 6 :(得分:4)

我喜欢你的答案,但我还要提到,Reflection也是获取/设置私有/受保护字段/属性的一种方式,否则在运行时将无法使用。

答案 7 :(得分:2)

反思是守则的简历。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

反射只不过是能够在运行时动态访问项目中未包含的其他dll方法(可能是系统或您自己创建的)。 避免循环依赖问题也很有帮助。

答案 10 :(得分:0)

反思是能够像 GOD G 通常 O perations D irector ;-) ) - 你可以看到'程序集的内部并执行各种动作(System.Reflection),专门为运行时设计,如查询类型及其成员,搜索接口或属性,实例化编译时未知的类型,甚至创建新类型(System.Reflection) .Emit)。

答案 11 :(得分:0)

通过在C#中使用Reflection,可以找到对象,方法和创建对象的详细信息,并在运行时调用方法。

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;
  }
}

下面的代码将获取类型信息:

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

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

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

以下代码段将调用AddNumb方法:

myMethodInfo.Invoke(myClassObj, mParam);