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. 总结《二》MFC中WinMain和CALLBACK

    MFC中WinMain和回调函数CALLBACK 一,路线        1.一般普通窗口或控件建立调用的CWnd :: CreateEx函数        2.经过资源对话框创建的即不调用的CWnd ...

  2. mysql性能优化1

    当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这 ...

  3. [转]mac上安装android sdk

    一.先下载android sdk for mac 给二个靠谱的网址: a). http://down.tech.sina.com.cn/page/45703.html b). http://mac.s ...

  4. python的数据结构之数字和字符串(四)

    一.数字 Python Number 数据类型用于存储数值.数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间. Python 支持四种不同的数值类型: 整型( ...

  5. Filter过滤器原理和登录实现

    Filter过滤器API      Servlet过滤器API包含了3个接口,它们都在javax.servlet包中,分别是Filter接口.FilterChain接口和FilterConfig接口. ...

  6. js小数运算出现多位小数如何解决

    小数相乘出现很多位小数的问题:这个问题自己以前也遇到过,现在特意来总结一下: Number类型: Number类型是ECMAScript中最常用和最令人关注的类型了:这种类型使用IEEE754格式来表 ...

  7. selinux配置错误实例介绍

    错误原因 配置关闭SELinux,结果误操作 应修改配置文件/etc/selinux/config中的“SELINUX”参数的值, # SELINUX=enforcing  原始配置 SELINUX= ...

  8. MySQL数据库----单表查询

    先创建表 #创建表 create table employee( id int not null unique auto_increment, name varchar(20) not null, s ...

  9. 07: python基础 零碎知识点

    目录: 1.1 python异常处理 1.2 三元运算,filter和map与lambda表达式结合使用举例 1.3 内置方法 1.4 动态导入模块 1.1 python异常处理返回顶部 1.Pyth ...

  10. java项目报错: org.springframework.beans.factory.BeanCreationException找不到mapper.xml文件

    错误代码 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userSer ...