C# 反射

有关元数据的解释:

https://www.cnblogs.com/DswCnblog/p/5344119.html

有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中

使用元数据,在运动时动态调用一个类型的成员,而不是执行编译时绑定

程序在运行时,可以查看其它程序集或本身的元数据,一个运行的程序查看本身的元数据或其它的元数据的行为叫做反射

要使用反射,我们必须使用System.Reflection命名空间

Type类

这类型是抽象类,因此它不能有实例,而是在运行时,CLR创建从Type派生的类的实例,Type包含了类型信息。当我们要访问这些实例时,CLR不会返回派生类的引用而是Type基类的引用

需要了解的Type重要事项是

对于程序中用到的每一个类型,CLR都会创建一个包含这个类型信息的Type类型对象

程序中用到的每一个类型都会关联到独立的Type类的对象

不管创建的类型由多少个实例,只有一个Type对象会关联到所有这些实例

还有类型是public的吗 Ispublic

类型的基类型是什么 BaseType

支持任何接口吗?GetInterfaces

都有什么特效在修饰类型Type.GetCustomAttributes

获取object对象

object类型包含了一个GetType的方法,它返回对实例Type对象的引用。由于每一个类型最终都是从object继承的,所有我们可以在任何类型对象上使用GetType方法来获取它的Type对象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace ConsoleApp2
{
    class BaseClass
    {
        public int BaseField = 0;
    }
    class DeriverClass : BaseClass
    {
        public int DervedField = 0;
    }

    class Program
    {
        static void Main(string[] args)
        {
            var bc = new BaseClass();
            var dc = new DeriverClass();
            BaseClass[] bac = new BaseClass[] { bc, dc };
            foreach (var v in bac)
            {
                Type t = v.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() ;
            }
        }
    }
}

使用Typeof运算符来获取Type对象。只需要提供类型名作为操作数,它就会返回Type对象的引用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace ConsoleApp2
{
    class BaseClass
    {
        public int MyFieldBase;
    }
    class DeriverClass : BaseClass
    {
        public int MyFieldDerived;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Type tbc = typeof(DeriverClass);
            Console.WriteLine("Result is {0}",tbc.Name);
            Console.WriteLine("It has the following fields");
            FieldInfo[] fi = tbc.GetFields();
            foreach(var f in fi)
            {
                Console.WriteLine("    {0}",f.Name);
            }
        }
    }
}

 

posted @ 2018-08-07 14:47  樱花落舞  阅读(197)  评论(0编辑  收藏  举报