zoukankan      html  css  js  c++  java
  • .NET 反射

    什么是反射?

    正常情况下高级语言通过编译器编译,生成exe、dll等,再通过cli/jit处理被机器语言识别(二进制)。exe文件DLL文件通过反编译可查看到文件中有metadata和IL。

    Metadata:是记录类中每一个元素;是一个数据清单。
    反射:Reflection命名空间,是微软提供一个帮助类库;读取元数据,使用元数据中对应的元素。

    一般情况下通过new对象,然后在调用方法等。new对象调用构造函数

    反射使用:

    第一步:动态加载dll 

    Assembly.load("xxx")

    Assembly.loadfrom("xxx.dll")

    Assembly.loadfile("c:/xxx/xxx.dll")全路径

    第二步:获取type

    Type t=Assembly.load("xxx").gettype("命令空间.库名")

    第三步:转换类型

    object o=activator.createInstance(t)在声明时确定类型

    获取到的是object类型,需要转换成需要的类型,可以通过强制类型转化、as 转化、dynamic

    类型 l=(类型)o;

    类型 l=o as 类型;

    dynamic o=activator.createInstance(t)在调用是确定类型

    第四步:调用方法

    o.show();

    另一种

    MethodInfo method = type.GetMethod("Show");//调用方法
    
    Object[] objPar = new Object[] { "OK" };参数数组
    
    object test = method.Invoke(o, objPar);//Invoke调用方法,带objetct类型,和参数数据
    不了解这2种区别在哪里?

    除了一般的方法外还有泛型类和泛型方法的反射。

    动态加载dll-》获取type(库名,带几个泛型参数就标注  ~3)-》makegenerictype-》转换类型调用方法

    Type t=Assembly.load("xxx").gettype("命令空间.库名~3")

    Type tt=t.makegenerictype(new type[] {typeof(int),typeof(string),typeof(datetime)})指定类型

    var o=activator.createInstance(tt)

    methodInfo mm=tt.GetMethod(“show”)

    mm.invoke(o,new object[]{123,"",datetime.now})

    反射除了可以获得方法外,还可以获得字段和属性。

    type t=typeof(student)

    object o=activator.createInstance(t)

    foreach(var p in t.getproperties())

    {

      if(p.name.equals("id"))

    {

      p.setvalue(o,123)

    }

    }

    字段类似,properties改成fields

    获取值就将set改为get  如:p.getvalue(o)

  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/yokiblogs/p/13605984.html
Copyright © 2011-2022 走看看