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. uva11107 后缀数组

    题意给了n个串 然后计算 这些串中的子串在大于1/2的串中出现 求出这个串的最长长度. 将这些串用一个每出现的不同的字符拼起来 ,然后二分找lcp #include <iostream> ...

  2. python 跳过可迭代对象的开始部分

    想遍历一个可迭代对象,但是它开始的某些元素你并不感兴趣,想跳过它们 itertools 模块中有一些函数可以完成这个任务.首先介绍的是itertools.dropwhile() 函数.使用时,你给它传 ...

  3. Linux服务器配置---ftp限制ip

    ftp限制IP 1.通过vsftpd的配置文件以及“hosts.deny”和“hosts.allow”文件设置允许某个ip地址访问 1)修改配置文件“/etc/vsftpd/vsftpd.conf”中 ...

  4. troubleshooting-执行导数shell脚本抛异常error=2, No such file or directory

    Cannot run program "order_log.sh" (in directory "/data/yarn/nm/usercache/chenweidong/ ...

  5. 20145310《网络对抗》注入shellcode及Return-to-libc

    Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. ...

  6. 20145322何志威《网络对抗技术》Exp6 信息搜集技术

    20145322何志威<网络对抗技术>Exp6 信息搜集技术 实验内容 掌握信息搜集的最基础技能: (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发 ...

  7. 20145329 《网络对抗技术》客户端Adobe阅读器渗透攻击

    两台虚拟机: kali ip:192.168.96.130 windows xp sp3 ip:192.168.96.133 1.kali下打开显示隐藏文件 2.在kali终端中开启msfconsol ...

  8. Win32程序支持命令行参数的做法(转载)

    转载:http://www.cnblogs.com/lanzhi/p/6470406.html 转载:http://blog.csdn.net/kelsel/article/details/52759 ...

  9. Hadoop新增和删除节点

    #新增节点 1.安装lunix,和以前一样的版本 2.初始化系统环境 2.1.设置静态ip vi /etc/sysconfig/network-scripts/ifcfg-eth0 //增加 #Adv ...

  10. keepalived主从及双主配置

    高可用有2中方式. 1.Nginx+keepalived 主从配置 这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候, ...