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. animation-play-state

    animation-play-state: css: .play-state{ -webkit-animation:f1 2s 0.5s infinite linear forwards altern ...

  2. fafu 1413

    叉积的运用 ,不断的用叉积去判断 最小的拼图, 刚开始对点进行排序,每个人的排序规则不同做法可能不同,我是按照点的x轴进行x轴相同用y小的在前面,然后每个点按照最下的点开始进行查找 每次从一个点出发然 ...

  3. 20154312 曾林 Exp8 web基础

    1.基础问题回答 1.1.什么是表单 1.2.浏览器可以解析运行什么语言 1.3.WebServer支持哪些动态语言 2.实践总结与体会 3.实践过程记录 ----3.1.Web前端:HTML基础 - ...

  4. Zookeeper使用实例——服务节点管理

    分布式处理中,总会存在多个服务节点同时工作,并且节点数量会随着网络规模的变化而动态增减,服务节点也有可能发生宕机与恢复.面对着动态增减的服务节点,我们如何保证客户请求被服务器正确处理呢.我们可以通过z ...

  5. linux常用命令:service 命令

    service命令用于对系统服务进行管理,比如启动(start).停止(stop).重启(restart).查看状态(status)等.相关的命令还包括chkconfig.ntsysv等,chkcon ...

  6. idea生成springboot jpa的实体对象

    在idea的database里面添加上数据库 File-->Project Structure Modules--->点击加号----->选择JPA  选择确认之后再主面板上就会出现 ...

  7. python文件操作-r、w、a、r+、w+、a+和b模式

    对文件操作的基本步骤 f=open('a.txt','r',encoding='utf-8') data=f.read() print(data) f.close() 文件的打开和关闭使用open() ...

  8. PHP 验证码:扭曲+粘连+变形

    一,绪论 由于项目需要,需要加强目前的验证码,我们参照的对象是支付宝. 基于PHP CodeIgniter 框架,代码放置在下面的路径下. /application/libraries 二,主要代码 ...

  9. 20145302张薇《课程设计》数据恢复——WinHex实践

    20145302张薇<课程设计>数据恢复--WinHex实践 实践内容 使用WinHex破损一个U盘 使用WinHex通过DBR备份数据来修复已损坏U盘 实践详细步骤 1.准备一个文件格式 ...

  10. ubuntu16.04下内核模块解析

    一.环境如下: 1.1内核版本: jello@jello:~$ uname -a Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19: ...