C#反射调用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); }

获取构造函数
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转换的好处,它不报错,类型不对的话就返回nullreflectionTest.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) }); //指定泛型参数类型TgenericMethod.Invoke(objTest2, new object[] { }); //泛型有参数var method4 = type.GetMethod("Show4"); //查找指定方法var genericMethod4 = method4.MakeGenericMethod(new Type[] { typeof(string) }); //指定泛型参数类型TgenericMethod4.Invoke(objTest2, new object[] { 123, "泛型string参数" });

反射测试类
位于SqlServerDB.dll中的ReflectionTest.cs文件中
/// /// 反射测试类/// 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(){Console.WriteLine("调用无参数泛型方法", this.GetType()); }public void Show4(int id,string name){Console.WriteLine($"调用有参数泛型方法,参数是{id},{name}", this.GetType()); }}

操作泛型类和泛型方法 加载DLL文件
Assembly assembly = Assembly.LoadFrom(@"SqlServerDB.dll");

获取指定类型
Type type = assembly.GetType("SqlServerDB.GenericClass`2").MakeGenericType(typeof(int), typeof(string)); //一定给定具体类型参数

调用泛型方法
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{public void GenericMethod(){Console.WriteLine("泛型类调用+泛型方法"); }}

操作类属性字段 加载DLL文件
Assembly assembly2 = Assembly.LoadFrom("SqlServerDB.dll");

获取指定类型
Type type2 = assembly2.GetType("SqlServerDB.PropertyClass");

调用泛型方法
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; }}

【C#反射调用dll文件中的方法操作泛型与属性字段】以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读