在还不太熟悉反射的昨天,以为反射很神秘,在网上到处找答案.今天找了段代码敲了一下,茅塞顿开!其实反射也就那么简单的一回事!
    反射是一种机制,通过这种机制我们可以知道一个未知类型的类型信息.比如,有一个对象a,这个对象不是我们定义的,也许是通过网络捕捉到的,也许是使用泛型定义的,但我们想知道这个对象的类型信息,想知道这个对象有哪些方法或者属性什么的.甚至我们想进一步调用这个对象的方法.关键是现在我们只知道它是一个对象,不知道它的类型,自然不会知道它有哪些方法等信息.这时我们该怎么办?反射机制就是解决这么一个问题的.通过反射机制我们可以知道未知类型对象的类型信息.
  再比如,我们有一个dll文件,我们想调用里面的类.现在假设这个dll文件的类的定义,数量等不是固定的,是经常变化的.也许某一天你要在这个dll里面增加一个类定义.也许你觉得这没什么问题,现在关键是我们在另一个程序集里面要调用这个dll,这是我们的程序必须能够适应这个dll的变化,也就是说即使改变了dll文件的定义也不需要改变我们的程序集.这时候我们就会使用一个未知dll.我们该怎么办?同样,反射机制帮助了我们,我们可以通过反射来实现.
  说白了,反射就是能知道我们未知类型的类型信息这么一个东西.没什么神秘可讲!

  今天我先讲一个获得程序集信息的例子.
  下面我们来举一个例子.例子的思路是这样的:我们有一个dll.该dll里面有许多关于运动的类.每一个类记录了一种体育运动的信息.我们在另外一个程序里面要知道这个dll的信息:(如果你还不能明白我的意思,请耐心的照我的步骤把这个过程走一变!)
  第一步:我们建一个文件Sport.cs.内容如下:

  using System;
  public abstract class Sport
  {
   protected string name;
  public abstract string GetDuration();
  public abstract string GetName();
  }

  咱们用命令"csc /t:library Sport.cs"编译它.
  第二步,我们再建一个名为SomeSports.cs的文件,内容如下:

using System;
public class Football:Sport
{
public Football()
{
name = "Football";
}
public override string GetDuration()
{
return "four 15 minute quarters";
} public override string GetName()
{
return name;
}
} public class Hockey:Sport
{
public Hockey()
{
name = "Hockey";
}
public override string GetDuration()
{
return "three 20 minute periods";
}
public override string GetName()
{
return name;
}
} public class Soccer:Sport
{
public Soccer()
{
name = "Soccer";
}
public override string GetDuration()
{
return "two 45 minute halves";
}
public override string GetName()
{
return name;
}
}

  下面我们用命令"csc /t:library /r:Sport.dll SomeSports.cs"编译该文件.

  现在我们有了我们的运动信息dll文件.现在我们想通过程序知道里面有哪些类.请进入最后一步:
第三步:我们创建文件AssemblyDemo.cs".内容如下:

using System;
using System.Reflection; public class AssemblyDemo
{
public static void Main(string[] args)
{
int i,j;
//==========================
//First the command line arguments are evaluated.if there isn't
//at least one,a usage message is printed
//=================================
if(args.GetLength()<)
{
Console.WriteLine("usage is AssemblyDemo<library_name>");
}
else
{
//======================== // An Assembly object is obtained from the command line argument
//======================== Assembly assembly=Assembly.LoadFrom(args[]); Type[] types=assembly.GetTypes();
Console.WriteLine(assembly.GetName().Name+"contains the following types"); for(i=;i<types.GetLength();++i)
{
Console.WriteLine("\r("+i+") " + types[i].Name);
}
i=types.Length - ;
Console.Write("make selection(0-"+i+");"); j=Convert.ToInt32(Console.ReadLine());
Console.WriteLine(); if(types[j].IsSubclassOf(typeof(Sport)))
{
ConstructorInfo ci=types[j].GetConstructor(new Type[]);
Sport sport=(Sport)ci.Invoke(new Object[]); Console.WriteLine(sport.GetName() + "has" + sport.GetDuration());
}
else
{
Console.WriteLine(types[j].Name + "is not a sub-class of Sport");
}
}
}
} }

咱们用命令"csc /r:Sport.dll AssemblyDemo.cs"编译该文件.
下面我们用"AssemblyDemo SomeSports.dll"运行该程序.

进一步程序要求我们输入选项,咱们输入1,就显示了结果:Hockeyhasthree 20 minute periods.

好了,今天就到这里了,下面我将进一步说明如何用反射机制访问对象的类型信息.

C#反射(一) 【转】的更多相关文章

  1. 隐私泄露杀手锏 —— Flash 权限反射

    [简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ...

  2. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  3. 关于 CSS 反射倒影的研究思考

    原文地址:https://css-tricks.com/state-css-reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览.该文章篇幅较长,内容庞杂,有 ...

  4. 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

    建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...

  5. 运用Mono.Cecil 反射读取.NET程序集元数据

    CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...

  6. .NET面试题系列[6] - 反射

    反射 - 定义,实例与优化 在面试中,通常会考察反射的定义(操作元数据),可以用反射做什么(获得程序集及其各个部件),反射有什么使用场景(ORM,序列化,反序列化,值类型比较等).如果答得好,还可能会 ...

  7. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  8. C++的性能C#的产能?! - .Net Native 系列五:.Net Native与反射

    此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第五个主题:.Net Native与反射. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列 ...

  9. [源码]Literacy 快速反射读写对象属性,字段

    Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但 ...

  10. SI与EMI(一) - 反射是怎样影响EMI

    Mark为期两天的EMC培训中大概分成四个时间差不多的部分,简单来说分别是SI.PI.回流.屏蔽.而在信号完整性的书籍中,也会把信号完整性分为:1.信号自身传输的问题(反射,损耗):2.信号与信号之间 ...

随机推荐

  1. UVM:8.2.4 factory 机制的调试

    1.UVM提供了print_override_info 帮助debug.以上节new_monitor 为例: 2.调用print_override_info : 结果: 实际调用debug_creat ...

  2. OpenFileDialog

    打开一个文件         private void button1_Click(object sender, EventArgs e)         {             openFile ...

  3. [互联网面试笔试汇总C/C++-7] 寻找两个链表的第一个交点-微策略

    题目:有两个链表,找出他们的第一个交点,要求每个链表只能遍历一次,可以对链表进行任何操作,空间O(1). 思路: 这个题目刚开始看觉得要遍历一次有点困难,但是仔细一想,人家告诉说可以对链表进行任何操作 ...

  4. android81 多线程下载和断电续传

    package com.itheima.multithreaddownload; import java.io.BufferedReader; import java.io.File; import ...

  5. iOS创建界面方法的讨论

    以前在入门的时候,找的入门书籍上编写的 demo 都是基于 Storyboards 拖界面的.后来接触公司项目,发现界面都是用纯代码去写复杂的 autoLayout 的.再然后,领导给我发了个 Mas ...

  6. Linux Bash算数运算方法小结

    A= B= 方法1:let(中间无空格) let C=$A+$B 方法2:$[  ] C=$[$A+$B] 方法3:$(()) C=$(($A+$B)) 方法4:expr(中间有空格) C=`expr ...

  7. Mysql解压版的安装

    Mysql解压版的安装 ——@梁WP 1.解压mysql到合适的地方 2.右击计算机-属性-高级系统设置-高级-环境变量,弹出“环境变量”对话框,修改下面的系统变量 3.新建MYSQL_HOME变量, ...

  8. 3G/4G网卡使用

    整体架构: pppd call option & ----------↓---------- option脚本(设置PPP连接) ----------↓---------- chat脚本(进行 ...

  9. PhotoShop常用快捷键(1)

    一.工具栏工具 移动工具 [V] 矩形.椭圆选框工具 [M] 套索.多边形套索.磁性套索 [L] 快速选择.魔棒工具[W] 裁剪工具 [C] 吸管.颜色取样器 [I] 修补.污点修复[J] 画笔工具 ...

  10. ITPub 上的一道题,学习下思路

    有意思的,从别处看来的即可为己用--拿来主义 数据库:MS SQL 2000: drop table mytest go create table mytest (   sn      int,    ...