c# 反射調用

c# 反射調用

反射加載DLL

                Assembly assembly = Assembly.Load("Ant.DB.SQLServer");//加載方式一:dll文件名(當前目錄)
                Assembly assembly1 = Assembly.LoadFile(@"E:\MyReflection\MyReflection\Ant.DB.SQLServer\bin\Debug\Ant.DB.Interface.dll");//加載方式二:完整路徑(文件具體路徑)
                Assembly assembly2 = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//方法三:完全限定名(當前目錄)
                Assembly assembly3 = Assembly.LoadFrom(@"E:\MyReflection\MyReflection\Ant.DB.SQLServer\bin\Debug\Ant.DB.Interface.dll");//(文件具體路徑)
                Console.WriteLine(assembly);
                Console.WriteLine(assembly1);
                Console.WriteLine(assembly2);
                Console.WriteLine(assembly3);


   foreach (var type in assembly.GetTypes())//找到所有類型
                {
                    Console.WriteLine(type.Name);
                    foreach (var item in type.GetMethods())
                    {
                        Console.WriteLine("method.name= "+ item);
                    }
                }

反射創建對象

 Assembly assembly = Assembly.Load("Ant.DB.SQLServer");//加載方式一:dll文件名(當前目錄)
                Type SQLServer_type = assembly.GetType("Ant.DB.SQLServer.SQLServerHelper");
               
                object obj = Activator.CreateInstance(SQLServer_type);
                SQLServerHelper ServerHelper= obj as SQLServerHelper;
                Students students = ServerHelper.Find(1);
                Console.WriteLine(students);



                Console.WriteLine("----------------------------------------Common--------------------------------");

使用反射創建對象(帶參數的構造函數)

   Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");
                Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");
                ConstructorInfo[] constructorInfos = type.GetConstructors();
                foreach (var constructor in constructorInfos)
                {
                    Console.WriteLine(constructor);//顯示類型
                }

                Console.WriteLine("************************創建對象************************");
               object oCotr1 = Activator.CreateInstance(type);//無參數構造函數
               object oCotr2 = Activator.CreateInstance(type,new object[] { "111"});
               object oCotr3 = Activator.CreateInstance(type, new object[] { 123});
               object oCotr4 = Activator.CreateInstance(type, new object[] { 123,"123" });
                #region Common
                Console.WriteLine("----------------------------------------Common--------------------------------");

使用反射創建對象(私有構造函數)

Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//加載DLL文件
Type type = assembly.GetType("Ant.DB.SQLServer.PrivateCtor");//獲取到類型
object oPrivate = Activator.CreateInstance(type, true);

使用反射創建泛型類

  Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//獲取DLL文件
                Type type = assembly.GetType("Ant.DB.SQLServer.GenericClass`3");//獲取到類型名稱 
                Type makeType = type.MakeGenericType(new Type[] { typeof(int), typeof(string), typeof(double) });
                object oGeneric = Activator.CreateInstance(makeType);

通過反射調用方法

方法無參數

Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//獲取DLL文件
                Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//獲取到類型名稱 
                object oReflection = Activator.CreateInstance(type);
                foreach (var method in type.GetMethods())
                {
                    Console.WriteLine(method.Name);
                    foreach (var parameter in method.GetParameters())
                    {
                        Console.WriteLine(parameter.Name + " " + parameter.ParameterType);
                    }

                    MethodInfo methodInfo = type.GetMethod("Test1");
                    methodInfo.Invoke(oReflection, null);//調用方法
                }

方法攜帶參數

 Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//獲取DLL文件
                Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//獲取到類型名稱 
                object oReflection = Activator.CreateInstance(type);
                foreach (var method in type.GetMethods())
                {
                    Console.WriteLine(method.Name);
                    foreach (var parameter in method.GetParameters())
                    {
                        Console.WriteLine(parameter.Name + " " + parameter.ParameterType);
                    }

               
                 MethodInfo methodInfo = type.GetMethod("Test2");
                 methodInfo.Invoke(oReflection, new object[] {123456 });//調用方法,攜帶參數
                }

有參數重載方法

   Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//獲取DLL文件
                Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//獲取到類型名稱 
                object oReflection = Activator.CreateInstance(type);
                foreach (var method in type.GetMethods())
                {
                    Console.WriteLine(method.Name);
                    foreach (var parameter in method.GetParameters())
                    {
                        Console.WriteLine(parameter.Name + " " + parameter.ParameterType);
                    }


                   MethodInfo methodInfo = type.GetMethod("Test3", new Type[] { typeof(int), typeof(string) });
                    methodInfo.Invoke(oReflection, new object[] { 133, "123" });//調用方法
                }

無參數重載方法

 Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//獲取DLL文件
                Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//獲取到類型名稱 
                object oReflection = Activator.CreateInstance(type);
                foreach (var method in type.GetMethods())
                {
                    Console.WriteLine(method.Name);
                    foreach (var parameter in method.GetParameters())
                    {
                        Console.WriteLine(parameter.Name + " " + parameter.ParameterType);
                    }


                    MethodInfo methodInfo = type.GetMethod("Test3", new Type[] { });
                      methodInfo.Invoke(oReflection, null);//調用方法
                }

靜態方法調用

MethodInfo methodInfo = type.GetMethod("Test5");
methodInfo.Invoke(oReflection, new object[] { "123" });//調用方法
MethodInfo methodInfo = type.GetMethod("Test5");
methodInfo.Invoke(null, new object[] { "123" });//調用方法

Invoke第一個參數爲對象的實例對象或null都可。

反射調用私有方法

                    Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//獲取DLL文件
                    Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//獲取到類型名稱 
                    object oReflection = Activator.CreateInstance(type);
                    MethodInfo methodInfo = type.GetMethod("Test4", BindingFlags.Instance | BindingFlags.NonPublic);
                    methodInfo.Invoke(oReflection, new object[] { "123" });

反射調用普通類中的泛型方法

MethodInfo methodGeneric = methodInfo.MakeGenericMethod(new Type[] { typeof(int), typeof(string), typeof(DateTime) });//確定方法的參數類型和個數
methodGeneric.Invoke(oReflection, new object[] { 1, "Ant編程", DateTime.Now });

泛型類裏的泛型方法調用

MethodInfo methodInfoNew = methodInfo.MakeGenericMethod(new Type[] { typeof(int), typeof(string), typeof(DateTime) });
methodInfoNew.Invoke(oReflection, new object[] { 1, "Ant編程", DateTime.Now });

反射操作字段和屬性等成員

  Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//獲取DLL文件
                Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//獲取到類型名稱 
                object oReflection = Activator.CreateInstance(type);
                Student studen = new Student()
                {
                    Id = 1,
                    StudentAddress = "xx",
                    StudentName = "giao"
                };

                foreach (var prop in type.GetProperties())
                {
                    Console.WriteLine($"{prop.PropertyType}+{prop.Name}={prop.GetValue(studen)}");
                    Console.WriteLine("-------------------------------------------------");
                    if (prop.Name.Equals("Id"))
                    {
                        prop.SetValue(studen, 2);
                    }
                    if (prop.Name.Equals("StudentName"))
                    {
                        prop.SetValue(studen, "giao");
                    }
                    if (prop.Name.Equals("StudentAddress"))
                    {
                        prop.SetValue(studen, "1111");
                    }
                    Console.WriteLine($"{prop.PropertyType}+{prop.Name}={prop.GetValue(studen)}");
                   
                }

還有個比較簡單的方式

PropertyInfo[] propertyInfos = type.GetProperties();//查找所有的屬性
PropertyInfo propertyInfo = type.GetProperty("Id");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章