何为反射?
反射指的是一个编程技巧,在当前应用领域的运行时间内,开发者可以利用它授权一个程序集检查并修改自身或其他程序集。那些检查能够让开发者执行比用其他方 法实现的更为强大的后期捆绑功能。反射是一个较新的微软开发方法;但是,Java和其他现代语言包含了与之十分相似的功能。作为.NET Framework的一项特色,反射能够被任何与.NET兼容的语言应用,如C#、VB.NET或J#。与本文的可下载版本一同的C#样本项目说明了本文 介绍的一些技巧。
反射的运作模式?
.NET Framework中生成的每个程序集都包含了描述程序集以及程序集中的类或结构的元数据。应用这个元数据,反射能够列举一个程序集所包含的一切类、结构和数据。一旦我们了解某一程序集的功能,就可能修改并利用这些功能。
为说明反射如何应用元数据,仔细研究下面从样本C#项目中摘录的代码。
private string ListProperties(object objectToInspect) { string returnString = ""; //To use reflection on an object, you // first need to get an instance // of that object's type. Type objectType = objectToInspect.GetType(); //After you have the object's type, you can get // information on that type. In this case, we're // asking the type to tell us all the // properties that it contains. PropertyInfo[] properties = objectType.GetProperties(); //You can then use the PropertyInfo array // to loop through each property of the type. foreach(PropertyInfo property in properties) { //The interest part of this code // is the GetValue method. This method // returns the value of the property. returnString += property.Name + ": " + property.GetValue(objectToInspect, null) + "\r\n"; } return returnString; }
在这段代码中,我们列举了一个类包含的属性。为完成这一点,反射应用程序集中的元数据返回一个包含类中的属性的PropertyInfo数组。然后我们循环遍历PropertyInfo数组,并单独访问每个属性。
在应用反射时,阅读元数据的过程对开发者是开放的。但是,反射应用元数据这一事实是重点。
应用反射
反射可用来执行一系列的功能。大多数的序列化引擎应用反射从需要序列化的对象中提取数据。反射还可以用内置模块来建立可自定义的应用结构。许多对象关系建模(ORM)还利用反射来执行动态映射功能。
虽然没有进行广泛宣传,反射的最有趣应用之一在于它能大大减少完成单调开发任务所需的时间。由于反射是完全动态的,它允许你在不必重新生成代码的情况下改变基本的结构,因而反射是一个非常优秀的代码生成替代工具。
例如,许多代码生成工具允许你根据基本的数据库建立数据对象。反射可用来从DataTables——它由数据库中返回——这样的数据结构中动态提取商业对 象(类)。应用这种方法,就不必应用代码生成器来生成代码。你只要简单地循环遍历DataTables中的竖栏,并将栏名称与商业对象中的属性名称动态匹 配。
还可用反射将一个对象的属性与一个存储程序参数动态捆绑起来。这个捆绑过程允许你建立普通的数据访问方法,提供代码生成工具为你带来的许多完全动态的优势。因此,反射能够显著减少代码长度,并缓解应用维护压力。
简单介绍
在本文中,我们只是触及问题的表层,说明反射能够帮助开发者编写更好的代码。在以后的文章中,我将以这篇介绍性的文章为基础,更加详细的说明反射的其他应 用与功能。我要讨论的主题包括访问方法和在运行时的类属性、从数据结构中提取商业对象、以及建立一个可由多个项目应用的普通数据访问层。