反射笔记 我一直在不断学习

反射笔记

   笔记以问题的形式记录,搞清楚这些问题,就是理解了反射.本笔记为阅读博客园中张子阳的文章之后所做的笔记,更多详细的记录,请访问这里.

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[] { });

 

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...