反射笔记
笔记以问题的形式记录,搞清楚这些问题,就是理解了反射.本笔记为阅读博客园中张子阳的文章之后所做的笔记,更多详细的记录,请访问这里.
1. 反射的基础是什么?
程序集,自定义特性,泛型.
2. 反射是什么?
是一种在运行时获得程序集或者类型的基本信息和元数据的机制.
3. 反射有什么用途?
(作者的一个例子是绑定下拉列表.)分三类:
1) 查看或者遍历类型或者程序集的基本信息或者元数据;
2) 动态的获得类型的实例,并调用它的成员.
3) 迟绑定(这个我还不明白,但是我知道替代分支语句的就是迟绑定).
4. 获得Type对象的三种方法?(也许不止三种,暂时我就记这三种)
1) Type.GetType(“类型的名称(带上命名空间)”);
2) typeof(类型的名称(带上命名空间));
3) 类型的实例.GetType();
5.获得程序集的两种方法?(也许不止两种,暂时我就记这三种)
1) Assembly.loadFrom(“程序集的名称.dll(全路径的,如果当前程序引用了直接写名称.dll)”);
2) Assembly.load(“程序集的名称”);
6.Type和程序集的关系辩证?(若不对,欢迎指正啊!)
通过Type可以获得类型所在的程序集,程序集包含很多类型(Type).但是最终获得成员信息主要是通过Type进行的,获得类型的基本信息跟获得程序集的基本信息有些不一样,类型的基本信息肯定没有module。
7.怎么通过Type的实例获得该类型的成员信息?
1) 获得成员
MemberInfo[] memberinfos=type.GetMembers();//获得类型的所有成员;
MemberInfo[] memberinfos=type.GetMembers(BindingFlags的枚举类型);//还可根据参数重载获得需要的成员。
2) 获得方法
MemberInfo[]
methods=type.FindMembers(MemberTypes.Method,BindingFlags的枚举类型,Type.FilterName,”*”);//第一个参数说明获得的是方法,第二个是条件,第三个是按照名字过滤,第四个表示返回所有的方法。
MethodInfo[]
methods=type.GetMethods();//
3) 获得字段
FieldInfo[] fields=type.GetFields();//获得所有字段,可以重载
4) 获得属性
PropertyInfo[] fields = type.GetProperties();
5) 获得构造函数
ConstructorInfo[] cons = type.GetConstructors();
6)获得事件
EventInfo[] events= type.GetEvents();
7)自定义特性
Object[] objects = type.GetCustomAttributes(typeof(ObsoleteAttribute),true);
8)基本信息
使用vs的提示,获得类型对象之后,可以看到如下信息,这些就是Type可以获得的类型基本信息。
8.怎么动态的获得类型的实例,并调用它的方法?
动态获得类型的实例有两种方法:分别如下,
Object obj = asm.CreateInstance("String",true);
Object obj1 = asm.CreateInstance("String",true,BindingFlags.Default,null,newObject[]{},null);
ObjectHandle handle= Activator.CreateInstance(null,"String");
调用方法:
使用InvokeMember调用方法
type.InvokeMember("subString",BindingFlags.InvokeMethod,typeof(System.String),new Object[] { });
使用MethodInfo.Invoke调用方法
MethodInfo ms = type.GetMethod("subString",BindingFlags.Instance);
ms.Invoke(obj,new Object[] { });