代码改变世界

反射定义及基础案例

2020-06-01 18:00  石吴玉  阅读(278)  评论(0编辑  收藏  举报

1.什么是元数据(MetaData)和反射(reflection)

 

 

一般情况下我们的程序都在处理数据的读、写、操作和展示。但是有些程序操作的数据不是数字、文本、图片,而是程序和程序类型本身的信息。

(1)元数据是包含程序以及类型信息的数据,它保存在程序的程序集当中。

(2)程序在运行的时候,可以查看其它程序集或者其它本身的元数据,这个行为就是反射。

 

2.Type类

BCL声明了一个Type类型(它是抽象类),用来包含类型的特性,使用这个类型的对象能让我们获取程序使用的类型的信息

--由于Type是抽象类,不能被实例化,而是在运行时,CLR创建从Type(RuntimeType)派生的类型的实例。当我们要访问这些实例的时候,CLR不会返回派生类的引用,而是返回Type基类的引用

 

 

 

 3.如何获取一个Type类对象

方式一:通过GetType方法

using System;
using System.Reflection;

namespace DeldgateTest
{
    public class Program
    {
        public delegate int MyDeletage(int s);
        public static void Main(string[] args)
        {
            var bc = new BaseClass();
            var dc = new DerivedClass();
            BaseClass[] arr = new BaseClass[] {bc,dc };
            foreach (var item in arr)
            {
                Type t = item.GetType();
                Console.WriteLine("Object Type:{0}", t.Name);
                FieldInfo[] fi = t.GetFields();
                foreach (var f in fi)
                {
                    Console.WriteLine("  Field:{0}",f.Name);
                }
                Console.WriteLine();
            }
            Console.WriteLine("End!");
            Console.ReadKey();
        }
    }

    public class BaseClass
    {
        public int BaseField = 0;
    }

    public class DerivedClass : BaseClass
    {
        public int DerivedField = 0;
    }
}
View Code

运行结果:

 

方式二: 通过typeof()方法获取一个类型的Type对象引用

using System;
using System.Reflection;

namespace DeldgateTest
{
    public class Program
    {
        public delegate int MyDeletage(int s);
        public static void Main(string[] args)
        {
            var bc = new BaseClass();
            var dc = new DerivedClass();
            Type t = typeof(DerivedClass);
            Console.WriteLine("Object Type:{0}", t.Name);
            FieldInfo[] fi = t.GetFields();
            foreach (var f in fi)
            {
                Console.WriteLine("Object Field:{0}", f.Name);
            }
            Console.WriteLine("End!");
            Console.ReadKey();
        }
    }

    public class BaseClass
    {
        public int BaseField = 0;
    }

    public class DerivedClass : BaseClass
    {
        public int DerivedField = 0;
    }
}
View Code

运行结果:

 

4.通过反射获取对象字段名称及字段值

using System;
using System.Reflection;

namespace DeldgateTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            UserInfo user = new UserInfo();
            user.ID = 1;
            user.age = 18;
            user.Name = "小明";
            Type t = user.GetType();
            Console.WriteLine("Object Type:{0}", t.Name);
            foreach (System.Reflection.PropertyInfo p in user.GetType().GetProperties())
            {
                Console.WriteLine("  Name:{0}; Value:{1}", p.Name,p.GetValue(user));
            }
            Console.WriteLine();
            Console.WriteLine("End!");
            Console.ReadKey();
        }
    }

    public class UserInfo
    {
        public int ID { get; set; }

        public int age { get; set; }

        public string Name { get; set; }
    }
}
View Code

运行结果:

 

5.获取基类型:BasetType

using System;
using System.Reflection;

namespace DeldgateTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var base1 = typeof(System.String).BaseType;
            var base2 = typeof(System.IO.FileStream).BaseType;
            var base3 = typeof(UserInfo).BaseType;
            Console.WriteLine("base1 Type:{0}", base1);
            Console.WriteLine("base2 Type:{0}", base2);
            Console.WriteLine("base3 Type:{0}", base3);
            Console.WriteLine();
            Console.WriteLine("End!");
            Console.ReadKey();
        }
    }

    public class Anmial
    {
        public int length { get; set; }
    }

    public class People:Anmial
    {
        public string color { get; set; }
    }
    public class UserInfo: People
    {
        public int ID { get; set; }

        public int age { get; set; }

        public string Name { get; set; }
    }
}
View Code

 运行结果:

(看下图得知,获取的是当前实例的上一级类型)

 

 

6.获取接口类型

using System;
using System.Reflection;

namespace DeldgateTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            foreach (var item in typeof(UserInfo).GetInterfaces())
            {
                Console.WriteLine("Name Type:{0}", item.Name);
            }
            
            Console.WriteLine();
            Console.WriteLine("End!");
            Console.ReadKey();
        }
    }

    public interface TUser
    {
        int ID { get; set; }

        int age { get; set; }

        string Name { get; set; }
    }
    public interface TPeople {
        string color { get; set; }
    }
    public class UserInfo: TUser,TPeople
    {
        public int ID { get; set; }

        public int age { get; set; }

        public string Name { get; set; }

        public string color { get; set; }

    }
}
View Code

运行结果:GetInterfaces()