zoukankan      html  css  js  c++  java
  • 反射笔记 我一直在不断学习

    反射笔记

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

    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,null);

    ObjectHandle handle= Activator.CreateInstance(null,"String");

    调用方法:

    使用InvokeMember调用方法

    type.InvokeMember("subString",BindingFlags.InvokeMethod, null,typeof(System.String) ,new Object[] { });

    使用MethodInfo.Invoke调用方法

    MethodInfo ms = type.GetMethod("subString",BindingFlags.Instance);

    ms.Invoke(obj, new Object[] { });

     

  • 相关阅读:
    DigitalOcean上使用Tornado+MongoDB+Nginx+Supervisor+DnsPod快速搭建个人博客
    创业三年来的一些感想
    创业三年来的一些感想
    ViEmuVS2013-3.2.1 破解
    瘋子C语言笔记(指针篇)
    瘋子C语言笔记(结构体/共用体/枚举篇)
    瘋子C++笔记
    petalinux add pre-build application to rootfs compile faliure solution
    QA Issue: No GNU_HASH in the elf binary
    视觉SLAM——特征点法与直接法对比以及主流开源方案对比 ORB LSD SVO DSO
  • 原文地址:https://www.cnblogs.com/snidget/p/2227163.html
Copyright © 2011-2022 走看看