zoukankan      html  css  js  c++  java
  • 反射手册笔记 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数组。

  • 相关阅读:
    各个控件说明
    html常用
    abp.message
    ABP框架——单表实体流程
    AngularJS $http和$.ajax
    AngularJS ng-if使用
    AngularJS 多级下拉框
    AngularJS 计时器
    AngularJS table循环数据
    Python之待学习记录
  • 原文地址:https://www.cnblogs.com/hanmos/p/2215711.html
Copyright © 2011-2022 走看看