• 反射手册笔记 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数组。
  • 相关阅读:
    Linux更改文件文件夹所属用户组(chgrp)
    Linux服务器查看请求数
    装Office 2010提示Error 1406的解决方法
    实时数据库简介和比较
    敏捷软件开发模型SCRUM【转】
    实时数据库系统
    实时数据库的事务处理
    各浏览器下使用 OBJECT 元素和 EMBED 元素嵌入 Flash 存在差异
    中国煤矿历年事故死亡人数及分析
    实时/历史数据库和关系型数据库的区别
  • 原文地址:https://www.cnblogs.com/Jax/p/877031.html
Copyright © 2020-2023  润新知