码迷,mamicode.com
首页 > Windows程序 > 详细

c#之初见反射

时间:2017-08-16 17:31:37      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:帮助   反射   lan   参数   需要   属性   详细信息   能力   激活   

一.什么是反射

          1.1 提供封装程序集、模块和类型的对象,说明它是一个对象

 

          1.2   反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。
 
          1.3  程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。
 
          1.4  可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,
                  可以调用类型的方法或访问其字段和属性。
                 ———百度百科 
二.c#中的反射介绍

          .2.1使用的命名空间——System.Reflection

           2.1反射使用的核心类 Type, Assembly ,Activator

           2.1.1Type:Type对象提供的属性和方法可以获取对象的一切信息,如:方法、字段、属性、事件...等等

           2.2.2Assembly:可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息。

           2.2.3Activator:包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用

           2.3其他的使用类,Module ,ConstructorInfo , MethodInfo , FieldInfo,PropertyInfo。。。。

           2.3.1Module:包含模块的程序集以及模块中的类等。可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

           2.3.2ConstructorInfo:解如下的类似信息构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息

         (如 abstract  或 virtual)等。

          2.3.3MethodInfo :了解如下的类似信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信

         息(如abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。

          2.3.4 FieldInfo:来了解如下的类似信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;

         并获取或设置字段值。

          2.3.5PropertyInfo:来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。

三.简单的使用反射

         3.1.利用Type获取类型和类的信息

          

            string str = "";
            //使用类名来获取类型 
            Type typeClass = typeof(string);
            //使用对象来获取类型
            Type typeObj = str.GetType();
            //打印str的类型
            Console.WriteLine("typeClass‘ type is {0}\n,typeObj ‘ type is {1}",
                               typeClass.Name, typeObj.Name);
            Console.WriteLine("*********************************************");
            //BindingFlags.Instance|BindingFlags.Public
            //| BindingFlags.NonPublic 获取类型的公开和非公开的属性
            foreach (PropertyInfo PI in typeObj.GetProperties(BindingFlags.Instance |
                                             BindingFlags.Public | BindingFlags.NonPublic))
            {
                 //打印类型的属性名字和属性的类型
                   Console.WriteLine("{0} TYPE IS {1}, ",
                                     PI.Name, PI.PropertyType.Name);   
            }
            Console.WriteLine("*********************************************");

            //BindingFlags.Instance|BindingFlags.Public
            //| BindingFlags.NonPublic 获取类型的公开和非公开的方法
            foreach (MethodInfo MI in typeObj.GetMethods(BindingFlags.Instance |
                                             BindingFlags.Public | BindingFlags.NonPublic))
            {
                //打印类型的方法名字
                Console.WriteLine("{0}‘s FUCN IS {1} ",
                                   typeObj.Name, MI.Name);
            }
            Console.ReadKey();

 

 

3.2上面我们用Type获取类型的信息 下面我们用获取的类型来创建的对象

使用type创建对象

    class SayHello
    {
        public SayHello()
        {
            Console.WriteLine("THIS IS SAYHELLO");
        
        }
        public void Say()
        {
            Console.WriteLine("I‘M SAYING SAYHELLO");
        }
    }
            //动态创建类型
            Type type = typeof(SayHello);
            Activator.CreateInstance(type);

程序会打印一个THIS IS SAYHELLO 说明我们创建了一个对象

 

3.3如何使用这个对象

  1. 我们可以使用接口来使用这个对象这种方法在这里就不说了

  2.我们可以使用MethodInfo这个类来调用方法

            Type type = typeof(SayHello);
            //在type中找到Say方法
            MethodInfo say = type.GetMethod("Say");
            //激活Activator.CreateInstance(type)的对象的Say方法
            say.Invoke(Activator.CreateInstance(type),null);

 

以上只是一些非常基础的知识,希望可以帮助大家对反射有一个基本的认识。

 

c#之初见反射

标签:帮助   反射   lan   参数   需要   属性   详细信息   能力   激活   

原文地址:http://www.cnblogs.com/KeyThink/p/7373681.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!