C# 反射

  • 什么是反射

 反射是.Net 提供的一个帮助类库,可以访问DLL,MetaData(元数据)。

 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象。 

 反射机制允许程序在执行过程中动态地添加各种功能。 

MetaData DLL exe
DLL和EXE的描述文件 应用程序扩展、动态库 可执行程序

typeof运算符
as ,is 能够测试两种类型的兼容性。但大多数情况下,还需要获得某个类型的具体信息。这就用到了typeof,它可以返回与具体类型相关的System.Type对象,通过System.Type对象可以去顶此类型的特征。一旦获得给定类型的Type对象,就可以通过使用该对象定义的各种属性,字段,方法来获取类型的具体信息。Type类包含了很多成员,在接下来的反射中再详细讨论。下面简单的演示Type对象,调用它的三个属性

点击查看代码
static void Main(string[] args)
        {
            Type t=typeof(StringBuilder);

            Console.WriteLine(t.FullName);  //FullName属性返回类型的全称

            if (t.IsClass)
            {
                Console.WriteLine("is a class"); //打印
            }
            if (t.IsSealed)  //是否为密封类
            {
                Console.WriteLine("is Sealed");  //打印
            }
            Console.ReadKey();

        }

常用的方法

  1. 加载dll到反射实例(命名空间+类名),使用时缺少加载的DLL的依赖项或者不存在的DLL会报错
点击查看代码
Assembly assemly = Assembly.Load("`nameSpace.class`"); 
  1. 获取模块信息、程序及类型数组集合、获取类型下的方法集合
点击查看代码
assemly.GetModules();
assemly.GetTypes();
assemly.GetTypes()[0].GetMethods();
  1. 加载类型并创建实例
点击查看代码
Type type = assemly.GetType("Class");
//调用无参构造函数创建一个运行对象
object instance = Activator.CreateInstance(type);
//调用有参构造函数(按顺序)创建一个运行对象
object instance1 = Activator.CreateInstance(type,new object[] { "parmeter"});

操作方法

点击查看代码
//加载类型
Type testType = assemly.GetType("Class");
//构造对象
object oTest = Activator.CreateInstance(testType);
//获取指定函数,函数参数类型,有重载的情况可以指定类型
MethodInfo method = testType.GetMethod("methods",new Type[] {"typeof(int)});
//调用函数
method.Invoke(oTest, null);
//获取方法参数
method.GetParameters()
//获取方法返回值
method.ReturnParameter

//调用泛型方法
Type genericType = assemly.GetType("GenericMethod");
object oGeneric = Activator.CreateInstance(genericType);
//获取方法
MethodInfo method = genericType.GetMethod("Show");
//指定方法参数类型
MethodInfo methodNew = method.MakeGenericMethod(typeof(int), typeof(string), typeof(int));
//调用函数
methodNew.Invoke(oGeneric, new object[] { 1, "admin", 0 });
posted @ 2021-12-14 14:14  含泪拒绝王阿姨i  阅读(130)  评论(0)    收藏  举报