反射手册笔记 2.程序集,对象和类型
第一部分:程序集(System.Reflection.Assembly)
1.获取Assembly对象
方法1:调用Assembly的以下4个静态方法Get...()之一:
- GetAssembly(Type t)
- GetCallingAssembly() ——返回调用当前方法的方法所在的程序集
- GetExecutingAssembly() ——返回当前执行代码所在的程序集
- GetEntryAssembly() ——返回当前AppDomain中包含Main方法的程序集
- Load(...)
- LoadWithPartialName(...)
- LoadFrom(...)
方法4:AppDomain.GetAssemblies() ——返回在AppDomain中加载的程序集。
2.获取到Assembly对象后,可以使用其提供的属性和方法,得到关于程序集的所有信息。见书上P19-20,这里不再抄录。
第二部分:类型(Type):包括 类/接口/数组/值类型/枚举/指针
1.获取Type对象
方法1:GetType()方法,有两个:
Object类中的方法,所以所有类都会继承这个方法,获取自身的Type对象:
Type myType = myObj.GetType(); ——实例方法
同时,Type类存在一个静态方法GetType,获取没有实例化的类的Type对象:
Type myType = Type.GetType("System.Double"); ——静态方法,这里System.Double以字符串形式传递,区分大小写
注意:VB.NET提供GetType运算符,获取对象的Type类型——C#下相应为typeof()方法:
Type myType = typeof(System.Double);
Dim myType as Type = GetType(System.Double); ——这里,System.Double不需要加引号,作为类来传递。
方法2:GetInstances()方法,获取对象实现或者继承的所有接口类型,返回一个Type数组:
Type[] myInterfaces = myObj.GetInstances();
方法3:Reflection.Module.GetType()方法:
Type myType = myModule.GetType("ClassName");
一个Module中可能有多个Class,获取模块中所有类型:Module.GetTypes();
查找Module中某一Class类型:Module.FindTypes();
2.获取到Type对象后,就可以访问类成员了,见第三部分。
第三部分:类成员
Type.GetXXX()获取相应的XXX,XXX指的是Method或Methods,Members,Propertiy等等。
1.MemberInfo
该类是一个抽象基类,成员类型都要从此派生。它提供了一些公共的属性:Name(成员名称);MemberType(成员类型)等等
通过Type的GetMembers()方法,配合BindingFlags枚举,可以检索成员:
myType.GetMembers(BindingFlags.Static | BindingFlags.Public);
或者 myType.GetMembers(BindingFlags.Instance | BindingFlags.NonPublic);
注意,BindingFlags.Instance与BindingFlags.Static不共存, BindingFlags.Public与BindingFlags.NonPublic不共存,否则,不会返回任何值——倒不是编译期/运行期报错。
所有的GetXXX()都可以这么用:GetFields, GetMethods....
2.FieldInfo
该类有两个方法很有用:GetValue()和SetValue():用于检索/修改字段值
3.PropertyInfo
该类也有GetValue()和SetValue()方法。还有CanRead和CanWrite属性
4.MethodBase
这是一个抽象类,是MethodInfo和ConstructorInfo的基类,声明了方法和构造函数的一些公共属性和方法。
5.MethodInfo
多了一个ReturnType属性
6.ConstructorInfo
当类中没有显示定义构造函数时,反射得到的元数据是默认构造函数。
7.EventInfo
这个类的属性有IsMulticase——是否委托链;EventHandlerType——相应委托的Type
方法有成对的GetAddMethod/GetRemoveMethod,以及GetRaiseMethod——返回激活事件时要调用的方法
8.ParemeterInfo
直接派生于System.Object
通过在MethodInfo对象或者ConstructorInfo对象上调用GetParameters()方法获取,不需要任何参数,返回一个ParemeterInfo数组。