網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、使用方法
查找DLL文件,
通過(guò)Reflection反射類(lèi)庫(kù)里的各種方法來(lái)操作dll文件
二、步驟
加載DLL文件
Assembly assembly1 = Assembly.Load("SqlServerDB");//方式一:這個(gè)DLL文件要在啟動(dòng)項(xiàng)目下
string filePath = Environment.CurrentDirectory + "";
Assembly assembly2 = Assembly.LoadFile(filePath + @"\SqlServerDB.dll");//方式二:完整路徑
Assembly assembly3 = Assembly.LoadFrom(filePath + @"\SqlServerDB.dll");//方式三:完整路徑
Assembly assembly4 = Assembly.LoadFrom(@"SqlServerDB.dll");//方式三:完整路徑
獲取指定類(lèi)型
foreach (var item in assembly4.GetTypes())//查找所有的類(lèi)型,就是有多少個(gè)類(lèi)
{
Console.WriteLine(item.Name);
}
獲取構(gòu)造函數(shù)
Type type = assembly4.GetType("SqlServerDB.ReflectionTest");//在ReflectionTest類(lèi)中調(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】實(shí)例化
//ReflectionTest reflectionTest = new ReflectionTest();//這種實(shí)例化是知道具體類(lèi)型--靜態(tài)
//object objTest = Activator.CreateInstance(type);//動(dòng)態(tài)實(shí)例化--調(diào)用我們的構(gòu)造方法
object objTest1 = Activator.CreateInstance(type, new object[] { "string" });//動(dòng)態(tài)實(shí)例化--調(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)換的好處,它不報(bào)錯(cuò),類(lèi)型不對(duì)的話就返回null
reflectionTest.Show1();
//調(diào)用私有方法
var method = type.GetMethod("Show2", BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(objTest2, new object[] { });
調(diào)用泛型方法
//泛型無(wú)參數(shù)
var method3 = type.GetMethod("Show3");//查找指定方法
var genericMethod = method3.MakeGenericMethod(new Type[] { typeof(int) });//指定泛型參數(shù)類(lèi)型T
genericMethod.Invoke(objTest2, new object[] { });
//泛型有參數(shù)
var method4 = type.GetMethod("Show4");//查找指定方法
var genericMethod4 = method4.MakeGenericMethod(new Type[] { typeof(string) });//指定泛型參數(shù)類(lèi)型T
genericMethod4.Invoke(objTest2, new object[] { 123, "泛型string參數(shù)" });
反射測(cè)試類(lèi)
位于SqlServerDB.dll中的ReflectionTest.cs文件中
/// <summary>
/// 反射測(cè)試類(lèi)
/// </summary>
public class ReflectionTest
{
//私有構(gòu)造函數(shù)
private ReflectionTest()
{
Console.WriteLine("這是私有無(wú)參數(shù)構(gòu)造方法");
}
//普通構(gòu)造函數(shù)
//public ReflectionTest()
//{
// Console.WriteLine("這是無(wú)參數(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)用無(wú)參數(shù)泛型方法", this.GetType());
}
public void Show4<T>(int id,string name)
{
Console.WriteLine($"調(diào)用有參數(shù)泛型方法,參數(shù)是{id},{name}", this.GetType());
}
}
操作泛型類(lèi)和泛型方法
加載DLL文件
Assembly assembly = Assembly.LoadFrom(@"SqlServerDB.dll");
獲取指定類(lèi)型
Type type = assembly.GetType("SqlServerDB.GenericClass`2").MakeGenericType(typeof(int), typeof(string));//一定給定具體類(lèi)型參數(shù)
調(diào)用泛型方法
object objTest2 = Activator.CreateInstance(type);
var method = type.GetMethod("GenericMethod").MakeGenericMethod(typeof(int));
method.Invoke(objTest2, new object[] { });
反射測(cè)試類(lèi)
位于SqlServerDB.dll中的GenericClass.cs文件中
public class GenericClass<T,W>
{
public void GenericMethod<TType>()
{
Console.WriteLine("泛型類(lèi)調(diào)用+泛型方法");
}
}
操作類(lèi)屬性字段
加載DLL文件
Assembly assembly2 = Assembly.LoadFrom("SqlServerDB.dll");
獲取指定類(lèi)型
Type type2 = assembly2.GetType("SqlServerDB.PropertyClass");
調(diào)用泛型方法
object obj = Activator.CreateInstance(type2);
foreach (var property in type2.GetProperties())
{
Console.WriteLine(property.Name);
//給屬性設(shè)置值
if (property.Name.Equals("Id"))
{
property.SetValue(obj, 1);
}
else if (property.Name.Equals("Name"))
{
property.SetValue(obj, "學(xué)習(xí)編程");
}
else if (property.Name.Equals("Phone"))
{
property.SetValue(obj, "123459789");
}
//獲取屬性值
Console.WriteLine(property.GetValue(obj));
}
反射測(cè)試類(lèi)
位于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
相關(guān)推薦
- 2022-06-24 Python抽象類(lèi)應(yīng)用詳情_(kāi)python
- 2022-08-25 C++詳細(xì)講解互斥量與lock_guard類(lèi)模板及死鎖_C 語(yǔ)言
- 2022-08-19 注解配置SpringMVC
- 2022-08-18 python編寫(xiě)第一個(gè)交互程序步驟示例教程_python
- 2022-09-16 淺析python中5個(gè)帶key的內(nèi)置函數(shù)_python
- 2022-04-09 SpringBoot 集成MyBatis-Plus提示反序列化異常:cannot deseriali
- 2023-02-27 pandas?pd.cut()與pd.qcut()的具體實(shí)現(xiàn)_python
- 2022-05-25 @NoArgsConstructor、@AllArgsConstructor、@RequiredAr
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支