1. 程式人生 > 其它 >C#基礎語法 の 反射

C#基礎語法 の 反射

技術標籤:c#c#反射

文章目錄



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