反射手册笔记 2.程序集,对象和类型

第一部分:程序集(System.Reflection.Assembly)
1.获取Assembly对象
    方法1:调用Assembly的以下4个静态方法Get...()之一:

  • GetAssembly(Type t)
  • GetCallingAssembly()     ——返回调用当前方法的方法所在的程序集
  • GetExecutingAssembly()       ——返回当前执行代码所在的程序集
  • GetEntryAssembly()       ——返回当前AppDomain中包含Main方法的程序集

    方法2:调用Assembly的以下3个静态方法Load(...)之一:括号中的...表示有若干种重载  

  • Load(...)
  • LoadWithPartialName(...)
  • LoadFrom(...)

    方法3:通过Type对象的Assebmly属性或者GetAssembly()方法,来获取表示此类型的程序集Assembly对象——等价于前面的Assembly.GetAssembly(Type t)静态方法

    方法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数组。

posted @ 2011-10-17 18:19  hanmos  阅读(270)  评论(0编辑  收藏  举报