反射操作dll类库之普通类和各种方法调用
2024-10-16 05:10:06
一、使用方法
查找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());
}
}
最新文章
- 笔记--mysql rpm 安装
- touches, targetTouches, changedTouches 区别
- 时间工厂[XDU1013]
- Gentoo安装配置过程与总结
- VB-获取某字符在其中出现的次数
- 鼠标聚焦到Text输入框时,按回车键刷新页面原因及解决方法
- 201521123122 Java 第二周学习总结
- [图像类名词解释][ RGB YUV HSV相关解释说明]
- PHPMailer发送邮件失败:SMTP connect failed
- Spark Scheduler模块源码分析之TaskScheduler和SchedulerBackend
- OpenCV导向滤波(引导滤波)实现(Guided Filter)代码,以及使用颜色先验算法去雾
- Linux高级运维 第五章 Vim编辑器和恢复ext4下误删除的文件-Xmanager工具
- Unity录音
- 网络通信协议五之IP协议详解
- ubuntu opencv
- oracle_效率优化
- file-loader引起的html-webpack-plugin坑
- Exp3:MAL_免杀原理与实践
- K/V式枚举
- oracle数据库存储过程中NO_DATA_FOUND不起作用解决