现在谈.Net反射机制本不在计划中,因为本打算研究完设计模式后再去学习别的技术;但迫于设计模式系列一创建型之(抽象工厂模式)一章中遗留问题,才不得已在设计模式之游中插入本篇文章!签于本人对反射理解也不够深入,这里也只做些简单介绍,详见MSDN;大牛们无须光顾!


1、反射简介

  • 概念:

      .Net 中Reflection翻译为“反射”,是.Net中获取运行时类型信息的一种方式。.Net的应用程序由几个部分:程序集(Assembly)、模块(Module)、类型 (class)组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。

  • 作用:
    1. Assembly类可以获得正在运行的装配件信息
    2. 可以动态的加载装配件
    3. 在装配件中查找类型信息
    4. 创建该类型的实例

第一次看到这样的词相信你也会不知所以然!一个很通俗的东东,一旦用专业术语表述就像很高雅。从字面意思根本无法明白它在.Net中是什么?通俗的讲,在形成最终的.exe或.dll之前,那些不相关的和相关的东西(比如说很多类)要打成包组装在一起,这些东西就叫做装配件。我们直接把它理解为exe和dll就可以了。 

  

2、反射应用

  1. Type类于获取类型信息

  System.Type 类对于反射起着核心的作用。当反射请求加载的类型时,公共语言运行库将为它创建一个 Type。可以使用 Type 对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。

以下所有均以设计模式系列一创建型之(抽象工厂模式)章节中为例:

      static void Main(string[] args)
{
ChinaFactory factory = new ChinaFactory();
Type type = factory.GetType();
Console.WriteLine(
"类型名:" + type.Name
+ "\n类全名:" + type.FullName
+ "\n命名空间名:" + type.Namespace
+ "\n程序集名:" + type.Assembly
+ "\n模块wei名:" + type.Module
+ "\n基类名:" + type.BaseType
+ "\n是否为类:" + type.IsClass
);
Console.ReadLine();
}

运行结果:

  2.获取程序集元数据

  Assembly类定义了一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。因为程序集中是使用元数据进行自我描述的,所以我们就能通过其元数据得到程序集内部的构成。结合Assembly和反射能够获取程序集的元数据,但是首先要将程序集装入内存中。可以使用Assembly类的多种静态Load方法加载程序集。

            //获取当前执行代码的程序集
Assembly assem = Assembly.GetExecutingAssembly();
Console.WriteLine("程序集全名:" + assem.FullName);
Console.WriteLine("程序集的版本:" + assem.GetName().Version);
Console.WriteLine("程序集初始位置:" + assem.CodeBase);
Console.WriteLine("程序集位置:" + assem.Location);
Console.WriteLine("程序集入口:" + assem.EntryPoint);
Type[] types = assem.GetTypes();
Console.WriteLine("程序集下包含的类型:");
foreach (var item in types)
{
Console.WriteLine("类:" + item.Name);
} Console.ReadLine();

运行结果:

  

  3.动态加载类型

  早绑定是在编译时绑定对象类型,而晚绑定是在运行时才绑定对象的类型。利用反射可以实现晚绑定,即动态加载类型,并调用他们的方法。听着挺神奇的,下面让我们爽一把:

            //获取当前执行代码的程序集
Assembly assem = Assembly.GetExecutingAssembly();
//从程序集中创建一个ChinaFactory实例并且用object类型的引用obj指向它
object obj = assem.CreateInstance("抽象工厂模式.ChinaFactory", false);
MethodInfo m = assem.GetType("抽象工厂模式.ChinaFactory").GetMethod("CreateBonus");
object objRet = m.Invoke(obj, null);
Console.WriteLine("CreateBonus returned {0}.", objRet);
//CreateBonus 返回IBonus类型
IBonus bonus = m.Invoke(obj, null) as IBonus;
Console.WriteLine(bonus.Calculate()); Console.ReadLine();

运行结果:

果真是强大!Ok,体验了一把也对反射有了一些简单的认知,下面就开始解决遗留的问题:如何解决抽象工厂中判断分支问题?

3、解决遗留问题

其实应用反射很简单:

    /// <summary>
/// AbstractFactory
/// </summary>
public abstract class AbstractFactory
{
public static AbstractFactory GetInstance()
{
string factoryName = ConfigurationManager.AppSettings["factoryName"];
AbstractFactory instance;
if (!string.IsNullOrEmpty(factoryName))
{
Assembly ass = Assembly.GetExecutingAssembly();
//动态创建类型
instance = (AbstractFactory)ass.CreateInstance("抽象工厂模式." + factoryName);
}
else
{
instance = null;
}
return instance;
}
public abstract IBonus CreateBonus();
public abstract ITax CreateTax();
}

这样看上去舒服多了,无论代码怎么变迁,我们只需要修改配置文件就Ok!

4、总结

以上只是反射的基本应用,其真正的实现原理还需继续深入探讨!

.Net反射机制的更多相关文章

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

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

  2. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  3. NPOI操作EXCEL(四)——反射机制批量导出excel文件

    前面我们已经实现了反射机制进行excel表格数据的解析,既然有上传就得有下载,我们再来写一个通用的导出方法,利用反射机制实现对系统所有数据列表的筛选结果导出excel功能. 我们来构想一下这样一个画面 ...

  4. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  5. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  6. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  7. c#反射机制

    一:反射的定义 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Sys ...

  8. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  9. Java中的反射机制

    Java反射机制 反射机制定义 反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许其对内部成员进行操作.由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的 ...

  10. C#反射机制 (转载)

    转载:原文出处      http://www.cnblogs.com/binfire/archive/2013/01/17/2864887.html 一:反射的定义 审查元数据并收集关于它的类型信息 ...

随机推荐

  1. luogu P1880 石子合并

    题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  2. PROFILE - 库存:物料状态支持 控制【物料状态定义】禁止的事务处理

    PROFILE 库存:物料状态支持

  3. EasyMvc入门教程-基本控件说明(7)文字块导航

    文字块导航其实就是开发winform时候常见的 带Title的Group面板..~!@#¥..好吧,没开发过winform的同学看下图: 实现代码如下: @Html.Q().BlockField(). ...

  4. 数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法

    #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Feb  7 14:38:33 201 ...

  5. 【音乐App】—— Vue-music 项目学习笔记:播放器内置组件开发(二)

    前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 播放模式切换 歌词滚动显示 ...

  6. nginx apache防盗链

    要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件.换句 ...

  7. vue2.X v-model 指令

    1.v-model指令 <!DOCTYPE html> <html> <head> <title></title> <script s ...

  8. bootcamp安装win7的详细步骤 (光盘安装)

      bootcamp安装win7的详细步骤 首先是要您确定以下内容(1)您的Mac系统下是一个盘符,也就是“macintosh hd”一个磁盘.如果不是的话,首先您需要做的是备份您分区下面的资料,让磁 ...

  9. HTML字体对应word字体

    42磅对应初号. 36磅对应小初. 26磅对应一号. 24磅对应小一号. 22磅对应二号. 18磅对应小二号. 16磅对应三号. 15磅对应小三号. 14磅对应四号. 12磅对应小四号. 10.5磅对 ...

  10. 查看本机外网ip地址

    DOS下是无法查看外网IP的,只能获取本机内网IP地址   外网IP只能通过专门的测IP网站 http://www.ip138.com/ip2city.asp