.net中 关于反射的详细介绍

概述反射

• 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象。
• 反射机制允许程序在执行过程中动态地添加各种功能。 

 运行时类型标识

•运行时类型标识(RTTI),可以在程序执行期间判定对象类型。例如使用它能够确切地知道基类引用指向了什么类型对象。
•运行时类型标识,能预先测试某个强制类型转换操作,能否成功,从而避免无效的强制类型转换异常。
•在c#中有三个支持RTTI的关键字:is 、 as  、typeof。 下面依次介绍他们 

 is运算符:

通过is运算符,能够判断对象类型是否为特顶类型,如果两种类型是相同类型,或者两者之间存在引用,装箱拆箱转换,则表明两种类型是兼容的。

复制代码 代码如下:


View Code

class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            B b = new B();
            if (a is A) 
            {
                Console.WriteLine("a is an A");   //这个打印,因为a 是 A 类型的对象
            }
            if (b is A)
            {
                //这个打印,因为b是B类型的对象,而B类型派生于A类型,由于b对象可以转换为A类型,因此b对象与A类型是兼容的,但是反过来就不成立,例如下面不打印
                Console.WriteLine("b is an A because it is derived from");
            }
            if (a is B)
            {
                //这个不打印
                Console.WriteLine("This won't display , because a not derived from B");
            }
            if (a is object)
            {
                //这个打印
                Console.WriteLine("a is an object");
            }
            Console.ReadKey();
        }
    }
    class A { }
    class B : A { }


as运算符:

 在运行期间执行类型转换,并且能够使得类型转换失败不抛异常,而返回一个null值,其实as也可以看作一个is运算符的简化备选方式(看例子)。

复制代码 代码如下:


View Code

class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            B b = new B();
            if (a is B)
            {
                b = (B)a;   //由于a变量不是B类型,因此这里将a变量转换为B类型是无效的。
            }
            else
            {
                b = null;
            }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjgpds.html