反射

反射(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. 用Get-ADComputer取非常用属性的值

    由于GE使用的是Windows2003+Powershell2.0, 所以某些命令无法使用,比如想取lastLogon和lastLogonTimestamp这两个属性,在Powershell3.0下可 ...

  2. Spring3.1 Cache注解

    依赖jar包: <!-- redis --> <dependency> <groupId>org.springframework.data</groupId& ...

  3. NBUT 1525 Cow Xor(01字典树+前缀思想)

    [1525] Cow Xor 时间限制: 2000 ms 内存限制: 65535 K 问题描述 农民约翰在喂奶牛的时候被另一个问题卡住了.他的所有N(1 <= N <= 100,000)个 ...

  4. 针对css3特性浏览器兼容 封装less

    //--------------------------------------------------- // LESS Prefixer //--------------------------- ...

  5. emacs notepad notepad++ 撤销比较

    以前使用编辑器都是直接上手,未读过什么的文档了解.所谓撤销只是使用,也不了解究竟撤销到何处,阅读了emacs的文档才知道有许多区别呢. 输入this is a pen,然后一个个字符地删除到this ...

  6. SiteMesh装饰器使用总结

    SiteMesh是一个Java WEB项目的网页布局和修饰框架.使用SiteMesh后就不再需要在每个页面中都用<jsp:include>标签引入页头.页尾.导航等其他公用页面了. 可以将 ...

  7. Apache Spark源码走读之20 -- ShuffleMapTask计算结果的保存与读取

    欢迎转载,转载请注明出处,徽沪一郎. 概要 ShuffleMapTask的计算结果保存在哪,随后Stage中的task又是如何知道从哪里去读取的呢,这个过程一直让我困惑不已. 用比较通俗一点的说法来解 ...

  8. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [2] 首页 APP 接口开发方案 ① 读取数据库方式

    方案一:读取数据库方式 从数据库读取信息→封装→生成接口数据 应用场景: 数据时效性比较高的系统 方案二:读取缓存方式 从数据库获取信息(第一次设置缓存或缓存失效时)→封装(第一次设置缓存或缓存失效时 ...

  9. 20145235 《Java程序设计》实验二

    实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 单元测试 代码及则是结果: public cla ...

  10. page show

    controller public function record() { $r = ; $m = M(); $query = $m->query('select count(1) as cou ...