C#反射Reflection

反射就是动态获取程序集中的元数据,直接通过.dll来创建对象,调用成员。

Type是反射一个重要的类。通过Type获取类中所有信息,包括方法,属性等。

一、Type的简单使用

1.通过typeof(类型名)或类实例.GetType()的方式获取某个类型的Type。

2.通过GetFields方法可以获取类型中的所有属性。

3.Activator.CreateInstance(类型的Type)可以创建类型的实例。

4.IsInstanceOfType(),判断是否是某一类型的的实例。

5.IsAssignableFrom(),判断是否能将后者类型的实例赋值给前者类型。

6.IsSubclassOf(),判断某一对象类型是否为“抽象类”,这里的抽象类指的是不可以实例化的类。

7.BaseType,获取父类的类型。

二、反射Reflection

1.通过Assemly.LoadFile()静态方法加载一个程序集,程序集可以看作是封装了很多类的文件。

2.GetTypes获取程序集中所有的类,GetType()获取指定类名的类,这是需要指定类的全名,即程序集的名字+类的名字。

3.GetExportedTypes(),获取所有的公有类,这个方法是访问不到私有类的。

5.GetMehod(),这里需要注意的是,如果搜索的方法有重载,直接通过方法名来搜索是找不到的,

这里需要通过第二个参数来选择,类型为Type[],如果想查找没有参数的方法,定义为new Type[]{}即可,不需要写任何的数据。

如果有参数,则按顺序写好即可。

6.通过MethodInfo的Invoke()方法来执行搜索到的方法,这里需要传入一个对象用来指示是那个类型的方法,还需要传入参数,这个方法是不存在1个参数的重载的,

处理方法和第5点一样,如果没有则写成new object[]{}即可。

7.GetProperty()搜索指定的属性,类型为PropertyInfo。

8.PropertyInfo通过GetValue()获取属性的值,SetValue()获取属性的。

9.创建实例的两种方法

a.Activator.CreateInstance(),但是Activator属性System命名空间,不知是否属于反射的方法。

b.通过构造函数的方法创建,由上述可以,通过Type可以获得指定类型的方法,则就可以获取到构造函数,

系统已经继承了GetConstructor()的方法,猜想内部应该也通过GetMethod实现的,这样通过执行搜索到

的构造函数就可以获取到相应类型的实例了。

10.总结

a.认情况下,GetMothod和GetProperty都是请求不到类的私有成员的,由方法的重载可知,这两个方法的重载中

都有BindingFlags的枚举选项,并且这个枚举还是标志枚举,枚举成员之间不是相互排斥的,而是互相兼容的。

它们可以同于与或非的操作来满足业务的需要。这里就把这个枚举设置为BindingFlags.NonPublic|BindingFlags.Instance,

表示为搜索匹配为非公共类型和实例类型,这样就会把私有类型加入到搜索范围内。

b.很多方法的重载方式一致通用的,例如在执行方法、搜索方法和搜索构造函数时,都需要传入数组类型的对象,

这时如果没有参数,则直接声明不进行赋值即可。

c.搜索到的类是可以转换为原本类型的实例的,通过as方法会对返回null时不报错。

d.反射是在线升级软件的一种方式,可以在初始版本中留下读取的程序集的“接口”,而程序集需要按照约定的形式书写。

这样每当有程序集放入时,程序启动来,就会去读取dll文件,并根据其中的内容做出相应的“升级”。

            Assembly asm = Assembly.LoadFile(@"G:\test\demo\myLibClass\bin\Debug\myLibClass.dll");
            //获取所有的类
            Type[] types = asm.GetTypes();
            for (int i = 0; i < types.Length; i++)
            {
                textBox1.AppendText(types[i].Name + "\r\n");
            }

            //获取所有的公有类
            Type[] t1 = asm.GetExportedTypes();

            for (int i = 0; i < t1.Length; i++)
            {
                textBox1.AppendText(t1[i].Name + "\r\n");
            }
            //获取指定的类型  需要填写全名 即命名空间+类名
            Type t2 = asm.GetType("myLibClass.student");

            //获取类型的某个方法
            MethodInfo m1 = t2.GetMethod("sayHi", new Type[] { });
            t2.GetMethod("", BindingFlags.NonPublic | BindingFlags.Instance);
            t2.GetProperty("", BindingFlags.NonPublic | BindingFlags.Instance);

            //根据类型创建对象
            object obj = Activator.CreateInstance(t2);

            string sss = m1.Invoke(obj, new string[] { }) as string;

            //获取类型的构造函数
            ConstructorInfo info = t2.GetConstructor(new Type[] { });

            //通过执行构造函数创建对象
            object stu = info.Invoke(obj, new object[] { });

            //获取属性
            PropertyInfo pinfo = t2.GetProperty("id");

            //设置属性的值  null表示该属性不是索引索性
            string id = pinfo.GetValue(obj, null).ToString();

  

时间: 2025-01-31 04:08:50

C#反射Reflection的相关文章

代理(Proxy)和反射(Reflection)

前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了Object.defineProperty()方法来支持开发者去做JS引擎早就可以实现的事情.ES6添加了一些内建对象,赋予开发者更多访问JS引擎的能力.代理(Proxy)是一种可以拦截并改变底层JS引擎操作的包装器,在新语言中通过它暴露内部运作的对象,从而让开发者可以创建内建的对象.本文将详细介绍代

公共技术点之 Java反射 Reflection

公共技术之 Java反射 Reflection 1. 了解Java中的反射 1.1 什么是Java的反射 Java反射是可以让我们在运行时获取类的函数.字段.父类.接口等Class内部信息的机制.通过反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值,即使方法或字段是私有的的也可以通过反射的形式调用,这种"看透class"的能力被称为内省,这种能力在框架开发中尤为重要. 有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此

代理(Proxy)和反射(Reflection) (转)

转自:http://www.cnblogs.com/xiaohuochai/p/7268600.html 前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了Object.defineProperty()方法来支持开发者去做JS引擎早就可以实现的事情.ES6添加了一些内建对象,赋予开发者更多访问JS引擎的能力.代理(Proxy)是一种可以拦截并改变底层

JAVA学习笔记(六十一)- 反射Reflection

反射Reflection import java.lang.reflect.Modifier; /* * 反射Reflection * java.lang.Class类 */ public class Test01 { public static void main(String[] args) { String name = "tom"; // 方式一:通过对象getClass()方法 // 任意一个类的对象,都有一个getClass()方法 // 可以通过此获取获取当前对象的类型所

Java学习笔记之反射(Reflection)

什么是反射 能够分析类能力的程序称为反射(reflection) 反射可以用来干什么 Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息. - 在运行中分析类的能力 - 在运行中查看对象 - 实现通用的数组操作代码 - 利用Method对象 Class类 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着这个对象所属的类.可以通过专门的Java类访问这些信息,保存这些信息的类被

C# 反射Reflection——反射反射程序员的快乐

一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Net-ORM-IOC-AOP 几乎所有的框架都离不开反射 如下图是程序执行的过程,高级语言经过编译器编译得到dll/exe文件,这里的文件可以跨平台使用,编译后的文件中其实包括了metadata元数据(数据清单,描述了DLL/exe里面的各种信息)和IL(也是一种面向对象语言,但是不太好阅读)在经过C

反射(Reflection)

反射主要用于在程序运行期间动态解析相关类的类名,命名空间,属性,方法并进行相应操作,以下通过两个简单的例子进行了说明: 示例1:调用程序集内部方法,运行时动态获取相关类的信息,包括类名,命名空间等信息并进行对象的创建及方法的调用: 测试类: class HI { public string Hi = "HelloWorld"; public string SayHello_CI() { return "Hello World!"; } public string S

c#之反射(Reflection)

一.反射是什么 反射就是.Net FrameWork框架为我们提供的一个帮助类库,它可以读取我们通过编译后生成的dll和exe文件里面metadate的信息. 反射可以动态的加载dll和exe文件,动态的创建对象,动态的调用方法,动态的获取属性的值和为属性赋值等等...... 二.通过反射获取信息 在C#程序中,我们可以用 System.Reflection 命名空间下的 Assembly 类来加载dll文件,从而来获取里面的信息,代码如下: Assembly assembly = Assemb

Spring基础之 反射(Reflection)

1.了解Class package com.inspire.reflection.Class_api; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ClassUtils { public static void main(String[] args) { String s="abc"; printcl