C#基礎語法 の 反射
阿新 • • 發佈:2020-12-25
文章目錄
1.反射定義
一個執行的程式,檢視本身的元素或其他型別的元資料的行為叫做反射
MVC、IOC、ORM、AOP 這些都用到反射。
2.簡單的例子
class BaseClass
{
public int BaseField = 0;
}
class DerivedClass:BaseClass
{
public int DerviedField = 0;
}
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
var dc = new DerivedClass();
BaseClass[] bca = new BaseClass[] { bc, dc };
foreach (var v in bca)
{
Type t = v.GetType();
Console. WriteLine($"Object type:{t.Name}");
FieldInfo[] fi = t.GetFields();
foreach (var f in fi)
{
Console.WriteLine($"File :{f.Name}");
}
Console.WriteLine();
}
}
輸出結果:
Object type:BaseClass
File :BaseField
Object type:DerivedClass
File :DerviedField
File :BaseField
3.常用的 Type 成員
成員 | 成員型別 | 描述 |
---|---|---|
Name | 屬性 | 返回型別的名字 |
Namespace | 屬性 | 返回型別的名稱空間 |
Assembly | 屬性 | 返回宣告型別的資料集 |
GetFields | 方法 | 返回型別的欄位列表 |
GetProperties | 方法 | 返回型別的屬性列表 |
GetMethods | 方法 | 返回型別的方法列表 |
4.對 dll 檔案使用反射
4.1 dll 檔案的讀取
通過程式集名稱返回Assembly物件
Assembly ass = Assembly.Load("ClassLibrary831");
通過DLL檔名稱返回Assembly物件
Assembly ass = Assembly.LoadFrom("ClassLibrary831.dll");
通過Assembly獲取程式集中類
Type t = ass.GetType("ClassLibrary831.NewClass"); //引數必須是類的全名
通過Assembly獲取程式集中所有的類
Type[] t = ass.GetTypes();
4.2 具體的例子
1. 目錄結構
2.程式碼
static void Main(string[] args)
{
// 載入 DLL 檔案
// 這個是直接動態載入
Assembly assembly = Assembly.Load("LibA");
// 和上面的區別是這個得用 dll 檔案
Assembly assembly1 = Assembly.LoadFrom("LibA.dll");
// 用絕對路徑引入
Assembly assembly2 = Assembly.LoadFile("D:/Desktop/test01/ConsoleApp3/LibA/bin/Debug/netstandard2.0/LibA.dll");
var Tpye = assembly2;
Console.WriteLine(Tpye.FullName);
// 獲取型別(這一步要在獲得 Dll 檔案的基礎上進行)
Type type = assembly.GetType("LibA.Class1");
object o = Activator.CreateInstance(type);// 必須是個type型別,簡單點說,必須是個類。
Console.WriteLine(type.Name);
// 用介面做強制規範,然他能 “點“ 出來
IAClasscs rel = type as IAClasscs;
rel.GetName();
//object mm = Activator.CreateInstance(type);
參考文獻
[1]https://www.cnblogs.com/Stephenchao/p/4481995.html
[2]https://www.bilibili.com/video/BV1hk4y1r7PZ