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. SV中的task和function

    SV中class的properties和methods默认都是public的,但是可以声明为local和protected. 一个properties声明为local类型的,则只在该class中的me ...

  2. UVALive - 7261 Xiongnu's Land

    思路: 先二分下界,再二分上届. #include <bits/stdc++.h> using namespace std; #define MP make_pair #define PB ...

  3. Python消息队列工具 Python-rq 中文教程

    原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...

  4. 日志处理(一) log4j 入门和详解(转)

    log4j  入门. 详解 转自雪飘寒的文章 1. Log4j  简介 在应用程序中添加日志记录总的来说基于三 个目的:    监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作 ...

  5. js 变量 作用域及内存

    由于Javascript是松散型的,所以其变量只是在特定时间用于保存特定值的一个名字而已,并不存在某个变量必须保存某种类型的值的规则,变量的值以及其数据类型都可以在脚本的声明周期内改变 一.基本类型与 ...

  6. Linux基础命令---bunzip2

    bunzip2 解压缩bzip2压缩过的文件. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法       bunzip2  ...

  7. Linux服务器---apache支持cgi

    Apache支持cgi  1.打开Apache配置文件httpd.conf,搜索“cgi”,找到下面的一段,去掉“addhandler”前面的“#“,这样就开启了Apache的cgi功能 [root@ ...

  8. javashop组件开发指南

    javashop组件开发指南 1.      概念解释 组件:可以理解为是插件,功能点的一个集合. 插件:是指具体的某个功能. 插件桩:是负责调用插件. 事件:是要决定什么时候执行插件 一个组件是由多 ...

  9. 利用arcgis处理遥感栅格数据,得到省平均值数据

    1.准备全国省级行政区数据,需要有省级行政区信息,如下所示: 2.生成渔网数据,操作完成会生成一个面数据和一个点数据,我们主要用点数据进行后面的操作. 3.提取栅格数据的值到渔网点数据中. 4.将区域 ...

  10. 20145329 《网络对抗技术》MSF基础应用

    实践目标 掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路.具体需要完成(1)一个主动攻击,如ms08_067;(2)一个针对浏览器的攻击,如ms11_050:(3)一个针对客户端 ...