什么是反射

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

Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。
Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。

2、命名空间与装配件的关系
        很多人对这个概念可能还是很不清晰,对于合格的.Net程序员,有必要对这点进行澄清。
        命名空间类似与Java的包,但又不完全等同,因为Java的包必须按照目录结构来放置,命名空间则不需要。

装配件是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是装配件。

装配件和命名空间的关系不是一一对应,也不互相包含,一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在,这样说可能有点模糊,举个例子:
首先我们建立一个类库,将它生成为HelloWorld.dll,

using System;

 namespace Webtest
 ...{

    public interface interface1
     ...{
          int add();
     
     }
     public class ReflectTest:interface1
     ...{
         
         public String Write;
         private String Writec;

         public String Writea
         ...{
             get
             ...{
                 return Write;
             }
             set
             ...{
                 Write = value;
             }
         
         }

         private String Writeb
         ...{
             get
             ...{
                 return Writec;
             }
             set
             ...{
                 Writec = value;
             }

         }

          public ReflectTest()
          ...{
              this.Write = "Write";
              this.Writec = "Writec";
          }

         public ReflectTest(string str1,string str2)
         ...{
             this.Write = str1;
             this.Writec = str2;
         }

         public string WriteString(string s,int b)
         ...{
             return "欢迎您," + s + "---" + b; ;
         }

          public static string WriteName(string s)
          ...{
             return "欢迎您光临," + s;
          }

         public string WriteNoPara()
         ...{
            return "您使用的是无参数方法";
         }

         private string WritePrivate()
         ...{
             return "私有类型的方法";
         }


         public int add()
         ...{
             return 5;
         }
     }
}

然后,建立再建立一个项目引入该HelloWorld.dll,

using System;

using System.Threading;
using System.Reflection;


class Test
...{
    delegate string TestDelegate(string value,int value1);

   static void Main()
    ...{
        //Assembly t = Assembly.LoadFrom("HelloWorld.dll"); 与下面相同的效果
        Assembly t = Assembly.Load("HelloWorld");

//**********************************************************************     
       foreach (Type aaa in t.GetTypes())
       ...{
            //Console.Write(aaa.Name);   //显示该dll下所有的类
        }

//**********************************************************************
        Module[] modules = t.GetModules();

        foreach (Module module in modules)
        ...{
            //Console.WriteLine("module name:" + module.Name);//显示模块的名字本例为"HelloWorld.dll"
        }

//**********************************************************************
        Type a = typeof(Webtest.ReflectTest);//得到具体的类的类型,和下面一个效果
        //Type a = t.GetType("Webtest.ReflectTest");//
        //Console.Write(a.Name);

//**********************************************************************
        string[] bb =...{ "aaaa", "bbbbb" };
        object obj = Activator.CreateInstance(a,bb); //创建该类的实例,后面的bb为有参构造函数的参数
        //object obj = t.CreateInstance("Webtest.ReflectTest");//与上面方法相同

//**********************************************************************        
        MethodInfo[] miArr = a.GetMethods();
        foreach (MethodInfo mi0 in miArr)
       ...{
            //Console.Write(mi0.Name);  //显示所有的共有方法
       }

//**********************************************************************
        MethodInfo mi = a.GetMethod("WriteString");//显示具体的方法
        object[] aa=...{"使用的是带有参数的非静态方法",2};
        string s = (string)mi.Invoke(obj,aa); //带参数方法的调用

        MethodInfo mi1 = a.GetMethod("WriteName");
        String[] aa1 =...{"使用的是静态方法"};
        string s1 = (string)mi1.Invoke(null, aa1); //静态方法的调用

        MethodInfo mi2 = a.GetMethod("WriteNoPara");
        string s2 = (string)mi2.Invoke(obj, null); //不带参数的方法调用

        MethodInfo mi3 = a.GetMethod("WritePrivate",BindingFlags.Instance | BindingFlags.NonPublic);
        string s3 = (string)mi3.Invoke(obj, null); //私有类型方法调用

        //Console.Write(s3);

//**********************************************************************
        PropertyInfo[] piArr = a.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        foreach (PropertyInfo pi in piArr)
        ...{
         //Console.Write(pi.Name);  //显示所有的属性
        }

//**********************************************************************
        PropertyInfo pi1=a.GetProperty("Writea");
        //pi1.SetValue(obj, "Writea", null);
        //Console.Write(pi1.GetValue(obj,null));

        PropertyInfo pi2 = a.GetProperty("Writeb", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        pi2.SetValue(obj, "Writeb", null);
        //Console.Write(pi2.GetValue(obj, null));

        FieldInfo fi1 = a.GetField("Write");
        //Console.Write(fi1.GetValue(obj));

//**********************************************************************
        ConstructorInfo[] ci1 = a.GetConstructors();
        foreach (ConstructorInfo ci in ci1)
        ...{
            //Console.Write(ci.ToString()); //获得构造函数的形式
        }

        ConstructorInfo asCI = a.GetConstructor(new Type[] ...{ typeof(string), typeof(string) });
        //Console.Write(asCI.ToString());

//**********************************************************************
        Webtest.interface1 obj1 = (Webtest.interface1)t.CreateInstance("Webtest.ReflectTest");
        Webtest.ReflectTest obj2 = (Webtest.ReflectTest)t.CreateInstance("Webtest.ReflectTest");
        //Console.Write(obj1.add());典型的工厂模式

//**********************************************************************
        foreach (Type tt in t.GetTypes())
        ...{
            if (tt.GetInterface("interface1")!=null)
            ...{
                Webtest.interface1 obj3 = (Webtest.interface1)Activator.CreateInstance(a);
                //Console.Write(obj3.add());
            }
        }

//**********************************************************************
        TestDelegate method = (TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate), obj, "WriteString");
       //动态创建委托的简单例子
        //Console.Write(method("str1", 2));

//**********************************************************************
        ConstructorInfo asCI1 = a.GetConstructor(new Type[0]);
        Webtest.ReflectTest obj5 = (Webtest.ReflectTest)asCI1.Invoke(null);
            //通过无参构造函数实例化的方法
        //Console.Write(obj5.Writea);

        ConstructorInfo asCI2 = a.GetConstructor(new Type[] ...{ typeof(string), typeof(string) });
          //通过有参构造函数实例化的方法
        Webtest.ReflectTest obj6 = (Webtest.ReflectTest)asCI2.Invoke(bb);
        Console.Write(obj6.Writea);
//**********************************************************************

        Console.Read();
    }   
}

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. javascript jssdk微信上传一张图片的方法

    javascript jssdk微信上传一张图片的方法 <pre> wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'co ...

  2. 基于Keras搭建MLP

    Keras是一套基于Tensorflow.Theano及CNTK后端的高层神经网络API,可以非常友好地支持快速实验,本文从零开始介绍了如何使用Keras搭建MLP并给出两个示例. 基于Ubuntu安 ...

  3. Python之路【第十五篇】开发FTP多线程程序

    要求: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 ...

  4. Windows10下QT5.13.2安装mingw64/MYSQL8.0驱动

    开始之前,先将编译器的路径添加到系统环境变量. 我的QT所以sql驱动是在下面这个目录中(大家在自己Qt的安装目录找到对应的文件夹就行,下面的路径也是如此), E:\qt\5.13.2\mingw73 ...

  5. GO指南练习:切片

    最近开始GO语言的学习,在GO指南中练习到切片这个题目 练习:切片 实现 Pic.它应当返回一个长度为 dy 的切片,其中每个元素是一个长度为 dx,元素类型为 uint8 的切片.当你运行此程序时, ...

  6. Hive学习笔记(一)——概述

    1.Hive是个什么玩意? Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据(有规律的数据)文件映射为一张表,并提供 ...

  7. 突然用xcode老版本调试老代码测试新机,报错"Could not find Developer Disk Image"回忆下

    转载:https://www.cnblogs.com/blogwithstudyofwyn/p/6003176.html 说明:更新了手机的到了iOS 10.0.2.真机调试时候提示"Cou ...

  8. Privoxy搭建代理服务器

    Privoxy搭建代理服务器 Docker Hub镜像地址 Dockerfile FROM alpine EXPOSE 8118 RUN apk --no-cache --update add pri ...

  9. 【转】Dubbo分布式服务框架

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的远程服务调用方案. Dubbo架构 官网架构图: 节点角色说明: Provider: 暴露服务的服务提供方. Consumer: 调用远程服务 ...

  10. JavaWeb项目目录结构

    今天本来是准备学习spring mvc + mybatis,结果被idea的配置环境卡主了,自己刚刚接触JavaWeb不久,所以浪费了很多时间.最终我回归最简单的servlet & jsp,并 ...