使用反射检索元数据
术语反射通常用来指镜像。如果您站在镜子面前,镜子会反射出您的所有物理属性,如:您的身高、肤色和身体结构。在C#中也一样,反射被用于反射程序有关的所有信息。C#程序可以利用反射获得类在运行时的信息。
反射在运行时获取类型信息的过程中被使用。提供运行时程序元数据信息的类在System.Reflection名称空间中。
System.Refection名称空间包含的类允许程序员获取关于正在运行的应用程序信息以及将类型、值和对象动态添加到那个应用程序。
反射通常用于:
- 查看元数据:允许您在运行时从代码查看属性信息。
- 执行类型发现:允许您检查程序集中的各种类型并实例化那些类型。
- 方法和属性的后期绑定:允许您使用类型发现在动态实例化的对象上调用属性和方法。
- 反射发出:允许您在运行时创建新类型,然后使用这些类型来执行任务。
查看元数据
要使用反射查看元数据,需要初始化System.Relection名称空间的MemberInfo对象。此对象有助于发现成员的属性并且提供对元数据信息的访问。可以通过进一步用漏洞修复示例读取Calculator类中的元数据来显示反射。要完成此操作,您需要定义Calculator类的对象,如以下代码段所示:
Type type = typeof( Calculator );
在上述代码段中,Calculator类型上的typeof运算符返回Type类的type对象。Type类是反射在类的根,这是访问元数据的基本方法。它封装了对象类型的表示。System.Refection名称空间的MemberInfo对象派生自封装有关成员信息的Type类。
获得Calculator类的类型信息后,您需要发起对GetCustomAttributes()方法的调用。此方法返回每个BugFixingAttribute属性类型的对象数组。
以下代码段显示了漏洞修复示例的已修复Main()方法:
using System;
using System.Reflection;
namespace Attribute_Example
{
/* create a custom sttribute to be assigned to class and its members */
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor | AttributeTargets.Field |
AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true
)]
public class BugFixingAttribute : System.Attribute
{
private int bugNo;
private string developer;
private string dateFixed;
public string remarks;
//attribute constructor for positional parameters
public BugFixingAttribute(int BugNo, string Developer