C#反射調(diào)用dll文件中的方法操作泛型與屬性字段
一、使用方法
查找DLL文件,
通過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); }
獲取構(gòu)造函數(shù)
Type type = assembly4.GetType("SqlServerDB.ReflectionTest");//在ReflectionTest類中調(diào)用 foreach (var ctor in type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) { Console.WriteLine($"構(gòu)造方法:{ctor.Name}"); foreach (var param in ctor.GetParameters()) { Console.WriteLine($"構(gòu)造方法的參數(shù):{param.ParameterType}"); } } //【3】實例化 //ReflectionTest reflectionTest = new ReflectionTest();//這種實例化是知道具體類型--靜態(tài) //object objTest = Activator.CreateInstance(type);//動態(tài)實例化--調(diào)用我們的構(gòu)造方法 object objTest1 = Activator.CreateInstance(type, new object[] { "string" });//動態(tài)實例化--調(diào)用我們的有參數(shù)構(gòu)造方法 //調(diào)用私有構(gòu)造函數(shù) //ReflectionTest reflectionTest = new ReflectionTest(); //普通調(diào)用 object objTest2 = Activator.CreateInstance(type, true);
調(diào)用非構(gòu)造方法
object objTest2 = Activator.CreateInstance(type, true); //調(diào)用普通方法 ReflectionTest reflectionTest = objTest2 as ReflectionTest;//as轉(zhuǎn)換的好處,它不報錯,類型不對的話就返回null reflectionTest.Show1(); //調(diào)用私有方法 var method = type.GetMethod("Show2", BindingFlags.Instance | BindingFlags.NonPublic); method.Invoke(objTest2, new object[] { });
調(diào)用泛型方法
//泛型無參數(shù) var method3 = type.GetMethod("Show3");//查找指定方法 var genericMethod = method3.MakeGenericMethod(new Type[] { typeof(int) });//指定泛型參數(shù)類型T genericMethod.Invoke(objTest2, new object[] { }); //泛型有參數(shù) var method4 = type.GetMethod("Show4");//查找指定方法 var genericMethod4 = method4.MakeGenericMethod(new Type[] { typeof(string) });//指定泛型參數(shù)類型T genericMethod4.Invoke(objTest2, new object[] { 123, "泛型string參數(shù)" });
反射測試類
位于SqlServerDB.dll中的ReflectionTest.cs文件中
/// <summary> /// 反射測試類 /// </summary> public class ReflectionTest { //私有構(gòu)造函數(shù) private ReflectionTest() { Console.WriteLine("這是私有無參數(shù)構(gòu)造方法"); } //普通構(gòu)造函數(shù) //public ReflectionTest() //{ // Console.WriteLine("這是無參數(shù)構(gòu)造方法"); //} public ReflectionTest(string name) { Console.WriteLine($"這是有參數(shù)構(gòu)造方法+參數(shù)值是:{name}"); } public void Show1() { Console.WriteLine("調(diào)用普通方法", this.GetType()); } private void Show2() { Console.WriteLine("調(diào)用私有方法",this.GetType()); } public void Show3<T>() { Console.WriteLine("調(diào)用無參數(shù)泛型方法", this.GetType()); } public void Show4<T>(int id,string name) { Console.WriteLine($"調(diào)用有參數(shù)泛型方法,參數(shù)是{id},{name}", this.GetType()); } }
操作泛型類和泛型方法
加載DLL文件
Assembly assembly = Assembly.LoadFrom(@"SqlServerDB.dll");
獲取指定類型
Type type = assembly.GetType("SqlServerDB.GenericClass`2").MakeGenericType(typeof(int), typeof(string));//一定給定具體類型參數(shù)
調(diào)用泛型方法
object objTest2 = Activator.CreateInstance(type); var method = type.GetMethod("GenericMethod").MakeGenericMethod(typeof(int)); method.Invoke(objTest2, new object[] { });
反射測試類
位于SqlServerDB.dll中的GenericClass.cs文件中
public class GenericClass<T,W> { public void GenericMethod<TType>() { Console.WriteLine("泛型類調(diào)用+泛型方法"); } }
操作類屬性字段
加載DLL文件
Assembly assembly2 = Assembly.LoadFrom("SqlServerDB.dll");
獲取指定類型
Type type2 = assembly2.GetType("SqlServerDB.PropertyClass");
調(diào)用泛型方法
object obj = Activator.CreateInstance(type2); foreach (var property in type2.GetProperties()) { Console.WriteLine(property.Name); //給屬性設置值 if (property.Name.Equals("Id")) { property.SetValue(obj, 1); } else if (property.Name.Equals("Name")) { property.SetValue(obj, "學習編程"); } else if (property.Name.Equals("Phone")) { property.SetValue(obj, "123459789"); } //獲取屬性值 Console.WriteLine(property.GetValue(obj)); }
反射測試類
位于SqlServerDB.dll中的PropertyClass.cs文件中
public class PropertyClass { public int Id { get; set; } public string Name { get; set; } public string Phone { get; set; } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C# Winform實現(xiàn)導入和導出Excel文件
這篇文章主要為大家詳細介紹了C# Winform實現(xiàn)導入和導出Excel文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12Entity Framework主從表數(shù)據(jù)加載方式
這篇文章介紹了Entity Framework主從表數(shù)據(jù)加載方式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06c# 將Datatable數(shù)據(jù)導出到Excel表格中
本文主要介紹了c# 將Datatable數(shù)據(jù)導出到Excel表格中的方法。具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03C# 制作PictureBox圓形頭像框并從數(shù)據(jù)庫中讀取頭像
C#提供的PictureBox控鍵默認情況下是方形的非常大的影響美觀,怎么解決這一問題呢?下面小編給大家?guī)砹薈# 制作PictureBox圓形頭像框并從數(shù)據(jù)庫中讀取頭像的操作代碼,感興趣的朋友一起學習下吧2021-08-08