反射

反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。

还可以获得每个成员的名称、限定符和参数等。

设计模式中

采用反射技术可以简化工厂的实现

1.工厂方法:通过反射可以将需要实现的子类名称传递给工厂方法,这样无须在子类中实现类的实例化。

2.抽象工厂:使用反射可以减少抽象工厂的子类。

采用反射技术可以极大简化对象的生成

1.命令模式:可以采用命令的类型名称作为参数直接获得命令的实例,并且可以动态执行命令。

2.享元模式:采用反射技术实例化享元可以简化享元工厂。

反射演示代码,如下:

static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        //[STAThread]
        static void Main()
        {
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());

            System.Console.WriteLine("列出程序集中的所有类型");
            //System.Reflection.Assembly 表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行时应用程序构造块
            Assembly a = Assembly.LoadFrom("Reflection.exe");
            //类型声明
            Type[] mytypes = a.GetTypes();

            foreach (Type t in mytypes)
            {
                System.Console.WriteLine(t.Name);
            }

            System.Console.ReadLine();
            System.Console.WriteLine("列出HellWord中的所有方法");

            Type ht = typeof(HelloWorld);
            // System.Reflection.MethodInfo 发现方法的属性并提供对方法元数据的访问
            MethodInfo[] mif = ht.GetMethods();

            foreach (MethodInfo mf in mif)
            {
                System.Console.WriteLine(mf.Name);
            }

            System.Console.ReadLine();
            System.Console.WriteLine("实例化HelloWorld,并调用SayHello方法");

            //实例化HelloWorld
            Object obj = Activator.CreateInstance(ht);
            string[] s = { "zhenlei" };
            //实例化HelloWorld
            Object objName = Activator.CreateInstance(ht, s);
            // System.Reflection.BindingFlags
            //指定控制绑定和由反射执行的成员和类型搜索方法的标志。
            //此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合。
            BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            MethodInfo msayhello = ht.GetMethod("SayHello");
            msayhello.Invoke(obj, null);
            msayhello.Invoke(objName, null);

            System.Console.ReadLine();
            System.Console.Read();
        }
    }
    /// <summary>
    /// HelloWorld类
    /// </summary>
    public class HelloWorld
    {
        string myName = null;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="name"></param>
        public HelloWorld(string name)
        {
            myName = name;
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        public HelloWorld()
            : this(null)
        { }
        /// <summary>
        /// 属性
        /// </summary>
        public string Name
        {
            get
            {
                return myName;
            }
        }
        /// <summary>
        /// 方法
        /// </summary>
        public void SayHello()
        {
            if (myName == null)
            {
                System.Console.WriteLine("Hello World");
            }
            else
            {
                System.Console.WriteLine("Hello," + myName);
            }
        }
    }

C#高级编程 反射 代码示例的更多相关文章

  1. 解决《UNIX环境高级编程》(APUE)示例代码的编译问题

    转自 http://cunsheng.sinaapp.com/?p=360 APUE中示例很多, 把这些源码拿来跑跑调调对学习理解有着莫大的帮助, 随书网站就提供了源码下载, 不过我自己在Linux和 ...

  2. C#高级编程----反射的小结

    C#反射的应用小结 1.何谓反射? 反射就是在运行的时候发现对象的相关信息.根据这些信息可以动态的执行对象的方法以及获取对象的属性所存储的值.使用.NET编写的代码时自动反射的,或者说是自我描述的.之 ...

  3. 利用注解进行sql反射代码示例

    @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Table { String val ...

  4. PHP高级特性-反射Reflection以及Factory工厂设计模式的结合使用[代码实例]

    PHP高级特性-反射以及工厂设计模式的结合使用 [结合 Laravel-Admin 代码实例讲解] 利用反射来实现工厂模式的生产而无需创建特定的工厂类 本文地址http://janrs.com/?p= ...

  5. Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题

    学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...

  6. unix环境高级编程附录 B 通用代码

    0.说明: 在测试 unix 环境高级编程中的代码时,需要一些作者事先写好的代码, 如: apue.h 包含某些标准系统头文件,定义许多常量及函数原型 还有两个作者自编的函数来对错误进行处理 1.ep ...

  7. Linux - Unix环境高级编程(第三版) 代码编译

    Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...

  8. C++调用Lua编程环境搭建及测试代码示例

    C++调用Lua编程环境搭建及测试代码示例 摘要:测试环境是VS2005+LuaForWindows_v5.1.4-45.exe+WIN7 1.安装lua开发环境LuaForWindows_v5.1. ...

  9. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

随机推荐

  1. [办公自动化]无法使用江南天安usbkey 无法使用视频网站

    同事打来电话说,无法使用江南天安开发的usbkey. 修复基本步骤记录如下: 1.卸载一切设备管理器中与之相关的驱动.拔出key. 2.重启计算机. 3.前往业务公开网站安装驱动. 4.插入key测试 ...

  2. tomcat bug之部署应用的时候经常会发上startup failed due to previous errors

    在tomcat上部署应用的时候经常会发上startup failed due to previous errors错误.这个错误产生以后经常会让人摸不到头脑.以下是几点查找经验: 1.web.xml文 ...

  3. Redis学习手册(Key操作命令)

    一.概述: 在该系列的前几篇博客中,主要讲述的是与Redis数据类型相关的命令,如String.List.Set.Hashes和Sorted-Set.这些命 令都具有一个共同点,即所有的操作都是针对与 ...

  4. PHP 用QueryList抓取网页内容

    http://www.cnblogs.com/wb145230/p/4716403.html 之前抓取网页数据都是用Java Jsoup,前几天听说用PHP抓更方便,今天就简单研究了一下,主要是用Qu ...

  5. Python For Data Analysis -- Pandas

    首先pandas的作者就是这本书的作者 对于Numpy,我们处理的对象是矩阵 pandas是基于numpy进行封装的,pandas的处理对象是二维表(tabular, spreadsheet-like ...

  6. C 判断路径存在

    1   用   int   access(const   char   *pathname,   int   mode);   判断有没有此文件或目录 --它区别不出这是文件还是目录2   用   i ...

  7. 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...

  8. C#中集合汇总

    平时敲代码,只关注如何使用,没有深入去研究一些本质性的东西,靠死记硬背,不去真正理解,其实最后是很难记住的. 对于C#常见的集合,自己平时好像只有用到List,Dictionary,ArrayList ...

  9. Nodejs路由之间的数据传递

    实例是模拟登录页面提交表单,然后根据信息判断是否登录成功 login.js var express =require('express'); var router =express.Router(); ...

  10. 算法训练 Hanoi问题

      算法训练 Hanoi问题   时间限制:1.0s   内存限制:512.0MB      问题描述 如果将课本上的Hanoi塔问题稍做修改:仍然是给定N只盘子,3根柱子,但是允许每次最多移动相邻的 ...