• C# 反射(一)


               刚工作没多久,需要对以往的知识进行复习和巩固。先讲讲最近在公司常用到的反射机制。

    反射(Reflection):提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。

    反射用到的命名空间:
        System.Reflection


    反射用到的主要类:
        System.Type 类--通过这个类可以访问任何给定数据类型的信息。
        System.Reflection.Assembly类--它可以用于访问给定程序集的信息,或者把这个程序集加载到程序中。

    反射一般运用于3种情况

    1,基于System.Type的反射;2,对方法,属性等的反射;3,动态加载以及推迟绑定。

    一,基于System.Type的反射 

     注:Type 类是反射类的核心。Type 封装了对象类型的表示。Type 类是访问元数据的主要手段。

    例1,

            static void Main(string[] args)
            {
                string s1 = "Hello Reflection!";
                int s2 = 888;
                Type t1 = s1.GetType();//获取s1的类型
                Type t2 = s2.GetType();
                Console.WriteLine(t1.FullName);// 获取t1的完全限定名
                Console.WriteLine(t2);// 有时候,t1.Fullname 与 t1 的运行效果是一样的,但下面就有本质的区别。

    }

     

     例 2,

              static void Main(string[] args)
            {

               Type t3 = Type.GetType("System.String", false, true);  //获取指定名称的 System.Type ,bool 型 - 是否抛出异常(false:找不到指定类型不抛出异常),

                //   bool 型 - 是否忽视区分大小写(true: 不区分大小写)
                Type t4 = Type.GetType("System.Strgging", false, true);
                Console.WriteLine(t3);

                Console.WriteLine("-----------");
                Console.WriteLine(t4);

                Console.WriteLine("-----------");

             }

     注意啦,例1上的 t1 与 t1.FullName 区别来啦

    将例2的 Console.WriteLine(t4) ; 改为 Console.WriteLine(t4.FullName); 查看运行结果。

      bug 来了!!!此处异常是在

     执行 Console.WriteLine(t4.FullName);时发生的。与上面  Type t4 = Type.GetType("System.Strgging", false, true); 的 bool false 的不抛出异常无关。

    例3,

      用 typeof 关键字 获取类型 与 GetType() 又不一样啦。

        typeof(string)//直接填写其类型即可

          static void Main(string[] args)
            {

                Type t5 = typeof(string);
                Type t6 = typeof(string2222);
                Console.WriteLine(t5);
                Console.WriteLine(t6);

    }

    // 这里面t5.FullName 与 t5 运行效果是一样的。 但是当所输入的类型不存在,即使你是 t6 不是 t6.FullName 也会抛异常的,不会显示为空。

        Type仍有许多用途,具体的查看一些相关书籍,先讲一些小例题,让大家熟悉一下反射的浅显内容,在 C#反射(二)在讲解  2,对方法,属性等的反射。

  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/anyihen/p/5321409.html
Copyright © 2020-2023  润新知