当前位置: 首页 > 编程语言 > C#

C#反射调用dll文件中的方法操作泛型和属性字段共享

时间:2023-04-11 01:45:27 C#

1.使用方法查找DLL文件,使用Reflection类库中的各种方法操作dll文件2.加载DLL文件的步骤Assemblyassembly1=Assembly.Load("SqlServerDB");//方法一:这个DLL文件应该在StringfilePath=Environment.CurrentDirectory+""启动项目下;Assemblyassembly2=Assembly.LoadFile(filePath+@"SqlServerDB.dll");//方法二:全路径Assemblyassembly3=Assembly.LoadFrom(filePath+@"SqlServerDB.dll");//方法三:全路径Assemblyassembly4=Assembly.LoadFrom(@"SqlServerDB.dll");//方法三:获取指定类型的完整路径foreach(variteminassembly4.GetTypes())//查找所有类型,即有多少个类{Console.WriteLine(item.Name);}获取构造函数Type=assembly4.GetType("SqlServerDB.ReflectionTest");//在ReflectionTest类中调用foreach(varctorintype.GetConstructors(BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public)){Console.WriteLine($"构造函数:{ctor.Name}");foreach(varparaminctor.GetParameters()){Console.WriteLine($"构造方法参数:{param.ParameterType}");}}//【3】实例化//ReflectionTestreflectionTest=newReflectionTest();//这种实现实例化就是知道具体的类型--static//objectobjTest=Activator.CreateInstance(type);//动态实例化--调用我们的构造方法objectobjTest1=Activator.CreateInstance(type,newobject[]{"string"});//动态实例化--调用我们带参数的构造函数//调用私有构造函数//ReflectionTestreflectionTest=newReflectionTest();//普通调用对象objTest2=Activator.CreateInstance(type,true);调用非结构方法对象objTest2=Activator.CreateInstance(type,true);//调用普通方法ReflectionTestreflectionTest=objTest2asReflectionTest;//as转换的好处,不报错,如果类型不对,返回nullreflectionTest.Show1();//调用私有方法varmethod=type.GetMethod("Show2",BindingFlags.Instance|BindingFlags.NonPublic);method.Invoke(objTest2,newobject[]{});调用泛型方法//泛型无参数varmethod3=type.GetMethod("Show3");//找到指定的方法vargenericMethod=method3.MakeGenericMethod(newType[]{typeof(int)});//指定泛型参数类型TgenericMethod.Invoke(objTest2,newobject[]{});//泛型有参数varmethod4=type.GetMethod("Show4");//找到指定方法vargenericMethod4=method4.MakeGenericMethod(newType[]{typeof(string)});//指定泛型参数类型TgenericMethod4.Invoke(objTest2,newobject[]{123,"泛型字符串参数"});反射测试类位于SqlServerDB.dll中的ReflectionTest.cs文件///

///反射测试类///publicclassReflectionTest{//privateconstructorprivateReflectionTest(){Console.WriteLine("这是一个私有的无参数构造函数");}//普通构造函数//publicReflectionTest()//{//Console.WriteLine("Thisisaparameterlessconstructionmethod");//}publicReflectionTest(stringname){Console.WriteLine($"这是参数化构造方法+参数值为:{name}");}publicvoidShow1(){Console.WriteLine("调用普通方法",this.GetType());}privatevoidShow2(){Console.WriteLine("调用私有方法",this.GetType());}publicvoidShow3(){Console.WriteLine("调用一个无参数泛型方法",this.GetType());}publicvoidShow4(intid,stringname){Console.WriteLine($"调用一个带参数的泛型方法,参数为{id},{name}",this.GetType());}}操作泛型类和泛型方法加载DLL文件Assemblyassembly=Assembly.LoadFrom(@"SqlServerDB.dll");获取指定类型Typetype=assembly.GetType("SqlServerDB.GenericClass`2").MakeGenericType(typeof(int),typeof(string));//必须给具体类型参数调用泛型方法对象objTest2=Activator.CreateInstance(类型);varmethod=type.GetMethod("GenericMethod").MakeGenericMethod(typeof(int));method.Invoke(objTest2,newobject[]{});反射测试类位于SqlServerDB.dll中的GenericClass.cs文件中}}操作类属性字段加载DLL文件Assemblyassembly2=Assembly.LoadFrom("SqlServerDB.dll");获取指定类型Typetype2=assembly2.GetType("SqlServerDB.PropertyClass");调用泛型方法对象obj=Activator.CreateInstance(type2);foreach(type2中的var属性。GetProperties()){控制台。WriteLine(属性。名称);//设置属性的值if(property.Name.Equals("Id")){property.SetValue(obj,1);}elseif(property.Name.Equals("Name")){property.SetValue(obj,"学习编程");}elseif(property.Name.Equals("Phone")){property.SetValue(obj,"123459789");}//获取属性值Console.WriteLine(property.GetValue(obj));}反射测试类位于SqlServerDB.dll中的PropertyClass.cs文件中publicclassPropertyClass{publicintId{get;放;}公共字符串名称{得到;放;}publicstringPhone{get;放;}}上面是C#学习教程:C#反射调用dll文件中的方法对泛型和属性字段进行操作。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: