c#之初见反射

一.什么是反射

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);

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

时间: 2024-08-17 16:30:54

c#之初见反射的相关文章

c# -反射 初见

反射是一个很强大的功能,不过好像有些消耗性能,大家慎重使用. 1.反射是干什么的? 通过反射,我们可与获取程序集中的原数据. 1.什么是程序集? dll.exe  这些将很多能实现具体功能的代码封装起来的文件(我自己的理解,可能不对!). 2.用到的情况有哪些? 编译器的提示功能 反编译 3.下面直接奉上一个实例的代码,供参考. (1)先建一个叫做Common的类库,在里面建一个叫Person的类,类的代码如下. using System; using System.Collections.Ge

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v

.Net 反射

反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直接创建对象,即使这个对象的类型在编译时还不知道.     反射的用途:    (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例.     (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全

C#图解教程 第二十四章 反射和特性

反射和特性元数据和反射Type 类获取Type对象什么是特性应用特性预定义的保留的特性Obsolete(废弃)特性Conditional特性调用者信息特性DebuggerStepThrough 特性其他预定义特性有关应用特性的更多内容多个特性其他类型的目标全局特性自定义特性声明自定义特性使用特性的构造函数指定构造函数使用构造函数构造函数中的位置参数和命名参数限制特性的使用自定义特性的最佳实践访问特性使用IsDefined方法使用GetCustomAttributes方法 Note 类的元数据包含

Java反射

1. 介绍 反射是一种能够在程序运行时动态访问.修改某个类中任意属性和方法的机制. 具体:对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性 在运行时,当加载完类之后,JVM在堆内存中会自动产生一个Class类型的对象,这个对象包含了完整的类的结构信息 这个Class对象就像一面镜子,透过这个镜子看到类的结构 那么,如何得到这个Class对象呢?以下可否 Class c = new Class(); 答案是不行的,因为Class的构造函数定义为私有

深入理解Java:类加载机制及反射

一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能. 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 2.工作机制 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示

通过反射了解集合泛型的本质

通过反射了解集合泛型的本质 import java.lang.reflect.Method; import java.util.ArrayList; /** * 通过反射了解集合泛型的本质 * @author shm * */ public class MethodDemo02 { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("hello"); list.add(

Java 反射详解

反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性.而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C

java中的反射机制和javaBean

反射 反射:就是通过一个类加载进方法区时加载到栈内存中的Class字节码文件对这个类进行解剖 通过反射可以获取到一个类的构造方法,成员方法,成员变量 反射将一个类的各个部分映射成相应的类 反射获取构造方法 Class类中方法 Constructor<?>[] getConstructors() 返回当前字节码文件对象的所有public修饰的构造方法 Constructor<T> getConstructor(Class<?>...parameterTypes)返回指定了