C# 反射(Reflection)

  反射(Reflection) 对象用于在运行时获取类型信息。该类位于 System.Reflection 命名空间中,可访问一个正在运行的程序的元数据。

  System.Reflection 命名空间包含了允许您获取有关应用程序信息及向应用程序动态添加类型、值和对象的类。

  反射(Reflection)的用途

  反射(Reflection)有下列用途:

  它允许在运行时查看属性(attribute)信息。

  它允许审查集合中的各种类型,以及实例化这些类型。

  它允许延迟绑定的方法和属性(property)。

  它允许在运行时创建新类型,然后使用这些类型执行一些任务。

  查看元数据

  我们已经在上面的章节中提到过,使用反射(Reflection)可以查看属性(attribute)信息。

  System.Reflection 类的 MemberInfo 对象需要被初始化,用于发现与类相关的属性(attribute)。为了做到这点,您可以定义目标类的一个对象,如下:

  System.Reflection.MemberInfo info = typeof(MyClass);

  下面的程序演示了这点:

  using System;

  [AttributeUsage(AttributeTargets.All)]

  public class HelpAttribute : System.Attribute

  {

  public readonly string Url;

  public string Topic // Topic 是一个命名(named)参数

  {

  get

  {

  return topic;

  }

  set

  {

  topic = value;

  }

  }

  public HelpAttribute(string url) // url 是一个定位(positional)参数

  {

  this.Url = url;

  }

  private string topic;

  }

  [HelpAttribute("Information on the class MyClass")]

  class MyClass

  {

  }

  namespace AttributeAppl

  {

  class Program

  {

  static void Main(string[] args)

  {

  System.Reflection.MemberInfo info = typeof(MyClass);

  object[] attributes = info.GetCustomAttributes(true);

  for (int i = 0; i < attributes.Length; i++)

  {

  System.Console.WriteLine(attributes[i]);

  }

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会显示附加到类 MyClass 上的自定义属性:

  HelpAttribute

  实例

  在本实例中,我们将使用在上一章中创建的 DeBugInfo 属性,并使用反射(Reflection)来读取 Rectangle 类中的元数据。

  using System;

  using System.Reflection;

  namespace BugFixApplication

  {

  // 一个自定义属性 BugFix 被赋给类及其成员

  [AttributeUsage(AttributeTargets.Class |

  AttributeTargets.Constructor |

  AttributeTargets.Field |

  AttributeTargets.Method |

  AttributeTargets.Property,

  AllowMultiple = true)]

  public class DeBugInfo : System.Attribute

  {

  private int bugNo;

  private string developer;

  private string lastReview;

  public string message;

  public DeBugInfo(int bg, string dev, string d)

  {

  this.bugNo = bg;

  this.developer = dev;

  this.lastReview = d;

  }

  public int BugNo

  {

  get

  {

  return bugNo;

  }

  }

  public string Developer

  {

  get

  {

  return developer;

  }

  }

  public string LastReview

  {

  get

  {

  return lastReview;

  }

  }

  public string Message

  {

  get

  {

  return message;

  }

  set

  {

  message = value;

  }

  }

  }

  [DeBugInfo(45, "Zara Ali", "12/8/2012",

  Message = "Return type mismatch")]

  [DeBugInfo(49, "Nuha Ali", "10/10/2012",

  Message = "Unused variable")]

  class Rectangle

  {

  // 成员变量

  protected double length;

  protected double width;

  public Rectangle(double l, double w)

  {

  length = l;

  width = w;

  }

  [DeBugInfo(55, "Zara Ali", "19/10/2012",

  Message = "Return type mismatch")]

  public double GetArea()

  {

  return length * width;

  }

  [DeBugInfo(56, "Zara Ali", "19/10/2012")]

  public void Display()

  {

  Console.WriteLine("Length: {0}", length);

  Console.WriteLine("Width: {0}", width);

  Console.WriteLine("Area: {0}", GetArea());

  }

  }//end class Rectangle

  class ExecuteRectangle

  {

  static void Main(string[] args)

  {

  Rectangle r = new Rectangle(4.5, 7.5);

  r.Display();

  Type type = typeof(Rectangle);

  // 遍历 Rectangle 类的属性

  foreach (Object attributes in type.GetCustomAttributes(false))

  {

  DeBugInfo dbi = (DeBugInfo)attributes;

  if (null != dbi)

  {

  Console.WriteLine("Bug no: {0}", dbi.BugNo);

  Console.WriteLine("Developer: {0}", dbi.Developer);

  Console.WriteLine("Last Reviewed: {0}",

  dbi.LastReview);

  Console.WriteLine("Remarks: {0}", dbi.Message);

  }

  }

  // 遍历方法属性

  foreach (MethodInfo m in type.GetMethods())

  {

  foreach (Attribute a in m.GetCustomAttributes(true))

  {

  DeBugInfo dbi = (DeBugInfo)a;

  if (null != dbi)

  {

  Console.WriteLine("Bug no: {0}, for Method: {1}",

  dbi.BugNo, m.Name);

  Console.WriteLine("Developer: {0}", dbi.Developer);

  Console.WriteLine("Last Reviewed: {0}",

  dbi.LastReview);

  Console.WriteLine("Remarks: {0}", dbi.Message);

  }

  }

  }

  Console.ReadLine();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Length: 4.5

  Width: 7.5

  Area: 33.75

  Bug No: 49

  Developer: Nuha Ali

  Last Reviewed: 10/10/2012

  Remarks: Unused variable

  Bug No: 45

  Developer: Zara Ali

  Last Reviewed: 12/8/2012

  Remarks: Return type mismatch

  Bug No: 55, for Method: GetArea

  Developer: Zara Ali

  Last Reviewed: 19/10/2012

  Remarks: Return type mismatch

  Bug No: 56, for Method: Display

  Developer: Zara Ali

  Last Reviewed: 19/10/2012

  Remarks:

  本文转载自:w3cschool(编辑:雷林鹏 来源:网络)

雷林鹏分享:C# 反射(Reflection)的更多相关文章

  1. 雷林鹏分享:C# 特性(Attribute)

    C# 特性(Attribute) 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.您可以通过使用特性向程序添加声明性信息.一个声明 ...

  2. 雷林鹏分享:C# 泛型(Generic)

    C# 泛型(Generic) 泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候.换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法 ...

  3. 雷林鹏分享:CodeIgniter 数据库操作

    在平时项目开发过程中,除了处理那些繁琐的逻辑过程外,还有一个重要的任务就是对数据库的操作处理.这里总结下自己平时使用CI过程中使用的如何对数据库进行操作处理. 在CI框架中,我们一般会把对数据库的操作 ...

  4. 雷林鹏分享:YAF路由问题

    这2天休年假,在家宅着学习研究了YAF框架,用YAF做过APP接口的项目,但是没有用来做过WEB方面的应用.趁着这2天在家想把博客用YAF进行一下改版,目的也想进一步学习一下YAF. 在这过程中遇到不 ...

  5. 雷林鹏分享:url中加号引发的错误

    刚发现了博客的一个bug,标签页中一些标签带有空格,在url输出中使用了 urlencode 函数进行处理,导致空格被转换成了加号(+),这时通过url访问时会出现错误: 临时解决方法是在urlcod ...

  6. 雷林鹏分享:Composer 安装

    下午在安装 Laravel 框架过程中,遇到了不少问题,因为 Laravel 的安装依赖于 composer,这里就先介绍一下 composer 的安装方法: 安装方法: #下载 sudo curl ...

  7. 雷林鹏分享:Laravel 安装

    前面我们介绍我了 composer安装,这里我们接着来介绍 Laravel框架的安装. 这里我们安装的是laravel 4 项目下载地址:https://github.com/laravel/lara ...

  8. 雷林鹏分享:CodeIgniter常用的数据库操作类

    在 CodeIgniter 中,使用数据库是非常频繁的事情.你可以使用框架自带的数据库类,就能便捷地进行数据库操作. 初始化数据库类 依据你的数据库配置载入并初始化数据库类: $this->lo ...

  9. 雷林鹏分享:jQuery EasyUI 数据网格 - 设置冻结列

    jQuery EasyUI 数据网格 - 设置冻结列 本实例演示如何冻结一些列,当用户在网格上移动水平滚动条时,冻结列不能滚动到视图的外部. 为了冻结列,您需要定义 frozenColumns 属性. ...

随机推荐

  1. cmd 笔记(随时补充)

    被一篇破解WIFI的标题文骗到了,所以学习一下CMD的命令 1 查看已经连接的wifi和密码 netsh wlan show profiles 回车 netsh wlan show profiles ...

  2. VS2010/MFC编程入门之三十九(文档、视图和框架:概述)

    前面几节讲了菜单.工具栏和状态栏的使用,鸡啄米本节开始将为大家讲解文档.视图和框架的知识. 文档.视图和框架简介 在VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)创建的单文档工 ...

  3. 排序-----插入排序(python版)

    直接插入排序的算法思路: (1) 设置监视哨r[0],将待插入纪录的值赋值给r[0]: (2) 设置开始查找的位置j: (3) 在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j] ...

  4. 使用IDEA 搭建SpringMVC +Easyui 实现最简单的数据展示功能

    效果图如下: 步骤如下: 1.导入jquery-easyui-1.5.5.6 2.导入相关的SpringMVC 的jar 包 3.编写datagrid.jsp 页面 <%-- Created b ...

  5. python 运行脚本报错 from keyword import iskeyword as _iskeyword ImportError: cannot import name iskeyword,说明python环境坏了,得重装,尚不知具体原因,

    C:\Python27\Scripts>python task_test.pyTraceback (most recent call last):  File "task_test.p ...

  6. 如何用有NFC功能的手机微信给公交卡充值?入口在那里?

    如何用有NFC功能的手机微信给公交卡充值?入口在那里? 需要两个前提: 1.NFC功能手机授权同意微信获取权限. 2.打开微信,并把公交卡放在手机背面贴紧. 选择下方的[充值金额],可以是10元.20 ...

  7. 网站app原型设计工具:axure,Mockups,墨刀

    网站app原型设计工具:axure,Mockups,墨刀 Balsamiq Mockups 3 网站原型设计工具非常高效,非常简单,几分钟就能搞定比axure好用很多 墨刀 - 免费的移动应用原型与线 ...

  8. MySQL Crash Course #02# Chapter 3. 4 通配符. 分页

    索引 查看表.文档操作 检索必须知道的两件事 数据演示由谁负责 通配符.非必要不用 检索不同的行 限制结果集.分页查找 运用数据库.表全名 命令后加分号对于很多 DBMS 都不是必要的,但是加了也没有 ...

  9. Python入门之面向对象的多态和继承

    本章内容 Python面向对象的多态和继承对比 ========================================= 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的 ...

  10. 08: python基础练习题

    1.while循环实现输出2 - 3 + 4 - 5 + 6 ... + 100 的和 # 使用while循环实现输出2 - 3 + 4 - 5 + 6 ... + 100 的和 s = 0 i = ...