C#反射调用dll文件中的方法操作泛型与属性字段
更新时间:2022年5月4日 23:39 点击:370 作者:農碼一生
一、使用方法
查找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转换的好处,它不报错,类型不对的话就返回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()); } }
操作泛型类和泛型方法
加载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<T,W> { public void GenericMethod<TType>() { 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; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
原文出处:https://www.cnblogs.com/wml-it/p/16055421.html
相关文章
- 我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要介绍了Spring AOP 对象内部方法间的嵌套调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-29
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25