反射操作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());
            }
        }
    
Tags: