许多.Net访谈问题清单(including the good ones)包含一个问题:“什么是反思?”。我最近被要求在5个问题的背景下回答这个问题,技术测试是在15分钟内在一张自助餐厅交给我的空白纸上完成的。我的回答是“反射允许您在运行时发现任何对象的方法,属性和字段”。回想起来,我的回答解释了如何使用反射,但它没有解释反射是什么。在我看来,我的回答足以表达我理解的反思,但没有解释是的反映。
所以,请在.Net的上下文中,用您自己的简洁词语,定义Reflection 的内容。回答不要花费超过三分钟。不要参考the .Net documentation,我们都已经看过了。
答案 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);