反射操作dll类库之普通类和各种方法调用

博客 动态
0 196
羽尘
羽尘 2022-03-25 16:57:09
悬赏:0 积分 收藏

反射操作dll类库之普通类和各种方法调用

一、使用方法

  1. 查找DLL文件,

  2. 通过Reflection反射类库里的各种方法来操作dll文件

二、步骤

  • 加载DLL文件

      Assembly assembly1 = Assembly.Load("SqlServerDB");//方式一:这个DLL文件要在启动项目下            string filePath = Environment.CurrentDirectory + "";            Assembly assembly2 = Assembly.LoadFile(filePath + @"\SqlServerDB.dll");//方式二:完整路径            Assembly assembly3 = Assembly.LoadFrom(filePath + @"\SqlServerDB.dll");//方式三:完整路径            Assembly assembly4 = Assembly.LoadFrom(@"SqlServerDB.dll");//方式三:完整路径
  • 获取指定类型

    foreach (var item in assembly4.GetTypes())//查找所有的类型,就是有多少个类            {                Console.WriteLine(item.Name);            }
  • 获取构造函数

      Type type = assembly4.GetType("SqlServerDB.ReflectionTest");//在ReflectionTest类中调用            foreach (var ctor in type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))            {                Console.WriteLine($"构造方法:{ctor.Name}");                foreach (var param in ctor.GetParameters())                {                    Console.WriteLine($"构造方法的参数:{param.ParameterType}");                }            }            //【3】实例化            //ReflectionTest reflectionTest = new ReflectionTest();//这种实例化是知道具体类型--静态            //object objTest = Activator.CreateInstance(type);//动态实例化--调用我们的构造方法            object objTest1 = Activator.CreateInstance(type, new object[] { "string" });//动态实例化--调用我们的有参数构造方法            //调用私有构造函数            //ReflectionTest reflectionTest = new ReflectionTest();  //普通调用            object objTest2 = Activator.CreateInstance(type, true);
  • 调用非构造方法

    			  object objTest2 = Activator.CreateInstance(type, true);			//调用普通方法            ReflectionTest reflectionTest = objTest2 as ReflectionTest;//as转换的好处,它不报错,类型不对的话就返回null            reflectionTest.Show1();            //调用私有方法            var method = type.GetMethod("Show2", BindingFlags.Instance | BindingFlags.NonPublic);            method.Invoke(objTest2, new object[] { });
  • 调用泛型方法

     			//泛型无参数            var method3 = type.GetMethod("Show3");//查找指定方法            var genericMethod = method3.MakeGenericMethod(new Type[] { typeof(int) });//指定泛型参数类型T            genericMethod.Invoke(objTest2, new object[] { });            //泛型有参数            var method4 = type.GetMethod("Show4");//查找指定方法            var genericMethod4 = method4.MakeGenericMethod(new Type[] { typeof(string) });//指定泛型参数类型T            genericMethod4.Invoke(objTest2, new object[] { 123, "泛型string参数" });
  • 反射测试类

    位于SqlServerDB.dll中的ReflectionTest.cs文件中

     /// <summary>    /// 反射测试类    /// </summary>   public class ReflectionTest    {        //私有构造函数        private ReflectionTest()        {            Console.WriteLine("这是私有无参数构造方法");        }        //普通构造函数        //public ReflectionTest()        //{        //    Console.WriteLine("这是无参数构造方法");        //}        public ReflectionTest(string name)        {            Console.WriteLine($"这是有参数构造方法+参数值是:{name}");        }        public void Show1()        {            Console.WriteLine("调用普通方法", this.GetType());        }        private void Show2()        {            Console.WriteLine("调用私有方法",this.GetType());        }        public void Show3<T>()        {            Console.WriteLine("调用无参数泛型方法", this.GetType());        }        public void Show4<T>(int id,string name)        {            Console.WriteLine($"调用有参数泛型方法,参数是{id},{name}", this.GetType());        }    }
posted @ 2022-03-25 16:36 農碼一生 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员