zoukankan      html  css  js  c++  java
  • C#反射从入门到放弃(这部分遇到的新东西太多了让人接受不能)

    首先,我们需要知道type,type是类型的类型(笑
    官方点的说法是,BCL声明了一个Type抽象类,它被设计用来包含类型的特性,
    使用这个类的对象(抽象类的对象?这显然是错误的,但是这里用的其实是Type的派生类的对象)能让我们获得程序使用的类型的信息,
    对于程序用到的每一个类型,CLR都会创建一个包含这个类信息的Type类(其实是Type类的派生类)的对象。

    就是你用到的每一个类,都有一个记录类信息的元数据(metadata),是Type类(Type抽象类的一个具体类RuntimeType类)的实例,typeof(你想洞察的类)就是得到 你想洞察的类的元数据。

    得到type有两种方式
    方式1:

    方式2:无需实例对象a直接写

    var type1 = typeof(A);
    

    两种方式的得到的type1和type2这两个引用是一样的,因为都是对A这个类获得其type

    我们能通过type1得到什么呢?

    (这只是显示的一部分,还有很多东西没有显示出来)
    返回成员:
    GetMember():GetMember是单数,单数就是你要指定一个名字,才能返回
    GetMembers():GetMembers是复数,用于取得该类的所有成员的信息
    返回方法:
    GetMethod():GetMethod是单数,单数就是你要指定一个名字,才能返回
    GetMethods():GetMethods是复数,用于取得该类的所有方法的信息
    下面的同理...
    返回内嵌类型:
    返回属性:
    等等...

    你拿到这些东西(属性,方法)后还可以调用它!

    调用属性举例:

    注意这里var的类型是PropertyInfo,里面一定包含了大量的东西!


    10.png)
    我们可以直接用Property.的方式,调用get方法和set方法了。


    SetValue([我希望对a操作,a是A类的实例],[赋值的string是aaa],[忽略第三个参数给null即可] );

    以上关键代码翻译:

                var type1 = typeof(A);
    //创建一个Type类的type1“引用”到A类的元数据(也就是type实例,创建A类时就存在了),
                var Property = type1.GetProperty("MyProperty");
    //通过type1“引用”到A类的元数据(type对象)并且拿到A类中一个叫MyProperty的属性,用Property 来“引用”MyProperty的属性
                var a = new A();
    //创建一个A类型的实例a
                Property.SetValue(a, "aaa", null);
    //通过Property“引用到”MyProperty属性,并给a这个实例的MyProperty属性,赋值"aaa"。
    

    这其实相当于绕了一个圈完成了

    var a = new A();
    a.MyProperty = "aaa";
    

    而且通过反射还可以重写a.MyProperty的值。(原a.MyProperty = "bbb",通过反射改为"aaa")

    调用方法举例:

    与属性的类似

    这里出现了Invoke方法,这个方法类似与属性部分的SetValue();是给方法Function()赋值用的。
    Invoke(object obj, object[] paramenters) ;
    第一个位置是obj也就是我们要传入的A类型实例a,
    第二个位置很奇怪,是个object[],怎么传输呢?
    这样写:

                function.Invoke(a, new object[] {1});
    

    new一个object加[]然后在{}里写入对应类型的值即可。

  • 相关阅读:
    mvn -v提示Permission denied
    JMeter生成HTML报告
    Python数据可视化神器pyecharts
    ThinkPHP 3.2.3 使用 Swift Mailer 邮件系统发送邮件
    qt的webkit
    Windows Driver Kit Version 7.1.0 ( 也就是 7600.16385.1 ) 下载地址
    erlang的调试配置
    emacs之开始就加载tag
    emacs之配置etags-select
    emacs之配置yasnippet
  • 原文地址:https://www.cnblogs.com/maomaodesu/p/11647514.html
Copyright © 2011-2022 走看看